Existe uma maneira de limitar a quantidade de dados que o Linux armazenará em cache no cache de gravação para um determinado dispositivo de bloco antes de começar a liberar esses dados para o disco?
Meu servidor tem uma grande quantidade de RAM (64GB ou mais). Eu acho que sempre que eu escrevo arquivos grandes para girar mídia (ou seja, mídia lenta) ou para lentidão de drives flash USB, o Linux armazena em cache gigabytes de dados graváveis na RAM. Para muitas operações em que apenas uma pequena quantidade de dados é gravada, isso é bom e o Linux acabará liberando o cache para o disco.
No entanto, quando estou fazendo grandes operações em arquivos grandes, o cache de gravação e a limpeza subseqüente fazem a interface do usuário parecer muito instável. Veja o exemplo simples de usar pv
para enviar um arquivo grande de um disco RAM para um armazenamento estável em uma unidade flash USB com velocidades de gravação baixas. Ele obterá mais de 1 GB de dados a uma taxa insana e, em seguida, diminuirá a velocidade normal de gravação em disco, mas, assim que a gravação for concluída, levará mais de um minuto para liberar o cache.
Outras aplicações aparecerão para escrever uma quantidade enorme de texto quase que instantaneamente, e então parar completamente por um minuto, então parecerão fazer outro monte de escrita instantaneamente, e então parar. Como os discos giratórios são bastante lentos, às vezes o atraso na liberação do cache é suficiente para lançar um OOPS no kernel com um processo interrompido por mais de 120 segundos. Fazer coisas como usar o ffmpeg para remodir um arquivo, transferir uma imagem de disco do VMware e operações de gravação "em massa" semelhantes em arquivos grandes e sequenciais tendem a causar esse efeito.
Eu gostaria de poder dizer ao Linux "no dispositivo / dev / sdX, somente cache no máximo, digamos, 64MB de dados antes de começar a liberar o cache". O que isso deve significar é que, no exemplo acima de pv
, apenas um máximo de 64 MB de dados deve permanecer para ser gravado depois que a IU indicar que a gravação foi concluída. Digitar o comando sync
deve ter apenas que liberar 64 MB. (No momento, fazer um pv
seguido por um sync
poderia travar sync
por mais de dois minutos, simplesmente porque o Linux armazenava gigabytes de dados e agora os descarrega em um dispositivo com apenas um dígito ou dezenas de megabytes por segundo velocidades de gravação.)
Eu não quero necessariamente limitar o cache de gravação do sistema, porque, por exemplo, minha unidade de inicialização que está em um SSD definitivamente se beneficia do cache, e operações típicas envolvendo gravações muito pequenas também se beneficiam bem dela. É apenas o caso em que grandes arquivos estão sendo escritos mais ou menos seqüencialmente onde é visível.
EDIT: Minha distro preferida é o Arch Linux, mas eu sou muito bom em adaptar instruções para outras distros para trabalhar com a minha configuração.