Eu tenho um aplicativo em tempo real que sempre grava dados em uma configuração de HDD RAID 10 de maneira sequencial em torno de ~50 MB/s. Ele usa mmap e a escrita nunca deve ser bloqueada devido à espera de E/S.
Às vezes, ocorre uma grande explosão de leitura, por exemplo, quero ler 500 GB de dados sequenciais da unidade o mais rápido possível. No entanto, isso pode não causar o bloqueio de E/S do aplicativo de gravação.
Resolvemos isso atualmente definindo o aplicativo de gravação como SCHED_FIFO e depois usando CFQ I/O Scheduler + I/O nice nos aplicativos de leitura. Isso funciona bem, mas é um pouco ineficiente, pois as unidades precisam procurar muito para frente e para trás para escrever e ler.
Gostaria de saber se existem estratégias para melhorar isso? A unidade do sistema é uma unidade SSD rápida de 256 GB. De alguma forma, eu poderia fazer com que o Linux escrevesse no SSD enquanto há espaço e as leituras estão ocorrendo? Isso é possível com, por exemplo, bcache, dmcache ou algum outro módulo? ou seja, ele só gravaria no SSD enquanto as leituras no HDD estivessem ocorrendo e depois o descarregaria no HDD. Se o cache SSD estiver "cheio", as gravações no HDD deverão ter prioridade total sobre as leituras.