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.
Tags performance io linux scheduling limit