Limitação por processo de bytes sujos sem abrandar todo o sistema

5

Dado um sistema ocupado com um dispositivo de bloqueio muito rápido (highend NVMe, gravação de 2 GB / s, leitura de 4 GB / s) montado em /data e um dispositivo muito lento (HDD USB com disco giratório de 8 TB, 50 MB / s de escrita, 60 MB / s de leitura) montado em /backup , como posso limitar a leitura e gravação de processos para /backup sem sacrificar a E / S de /data ?

Até onde eu sei, o problema é que o Linux só tem os botões global dirty_background_bytes e dirty_bytes . Se eu definir esses limites para valores sensíveis para NVMe (em torno de 2 GB e 4 GB, na prática), a taxa de transferência ficará boa até que um processo (por exemplo, rsync ) comece a gravar em USB com muitos dados. Nesse caso, dirty_background é preenchido com dados que vão para o dispositivo USB e rsync é impedido de sujar mais páginas. No entanto, isso faz com que os processos de gravação em dispositivos rápidos sejam desacelerados de forma agressiva porque dirty_background é um limite global e compartilhado entre dispositivos rápidos e lentos. Sei que posso limitar os bytes sujos de acordo com o dispositivo mais lento conectado ao sistema e que evitará quedas gigantescas, mas sacrificará alguns débitos dos dispositivos mais rápidos.

Existe o equivalente a dirty_background_bytes para um dispositivo de bloco único? Realmente não faz sentido retardar todos os processos gravados em /data no caso /backup é lento e acessado por algum outro processo.

Eu sei que cgroup pode ser usado para fazer isso manualmente ( Como Acelerar por processo I / O para um limite máximo? ). No entanto, eu gostaria de ajustar este dispositivo por bloco e todos os processos que acessam os ditos dispositivos devem ser diminuídos antes de retardar todo o sistema. Se um processo gravar em dispositivos rápidos e lentos, ele deverá ser reduzido apenas se estiver gravando demais para o dispositivo lento.

    
por Mikko Rantalainen 16.05.2017 / 15:49

0 respostas