Parece que você já tentou muitas das coisas que eu sugeriria inicialmente (ajustes na configuração de troca, alteração de agendadores de E / S, etc.).
Além do que você já tentou alterar, sugiro pesquisar a alteração dos padrões de morte cerebral para o comportamento de write-back da VM. Isso é gerenciado pelos seguintes seis valores de sysctl:
-
vm.dirty_ratio
: controla quantas gravações devem estar pendentes para write-back antes de serem acionadas. Manipula o write-back em primeiro plano (por processo) e é expresso como uma porcentagem inteira de RAM. Padrões para 10% de RAM
-
vm.dirty_background_ratio
: controla quantas gravações devem estar pendentes para write-back antes de serem acionadas. Manipula write-back em segundo plano (em todo o sistema) e é expresso como uma porcentagem inteira de RAM. Padrões para 20% de RAM
-
vm.dirty_bytes
: O mesmo que vm.dirty_ratio
, exceto expresso como um número total de bytes. Ou ou vm.dirty_ratio
será usado, o que foi escrito para durar.
-
vm.dirty_background_bytes
: O mesmo que vm.dirty_background_ratio
, exceto expresso como um número total de bytes. Ou ou vm.dirty_background_ratio
será usado, o que foi escrito para durar.
-
vm.dirty_expire_centisecs
: Quantos centésimos de segundo devem ser passados antes que o writeback pendente seja iniciado quando os quatro valores de sysctl acima já não forem acionados. O padrão é 100 (um segundo).
-
vm.dirty_writeback_centisecs
: Com que frequência (em centésimos de segundo) o kernel avaliará páginas sujas para write-back. O padrão é 10 (um décimo de segundo).
Assim, com os valores padrão, a cada décimo de segundo, o kernel fará o seguinte:
- Anote todas as páginas modificadas para armazenamento persistente se elas foram modificadas pela última vez há mais de um segundo.
- Escreva todas as páginas modificadas para um processo se a quantidade total de memória modificada que não foi gravada exceder 10% da RAM.
- Anote todas as páginas modificadas no sistema se a quantidade total de memória modificada que não foi gravada exceder 20% da RAM.
Portanto, deve ser muito fácil ver por que os valores padrão podem estar causando problemas para você, porque seu sistema pode estar tentando gravar até 4 gigabytes de dados para armazenamento persistente a cada < em> décimo de um segundo.
O consenso geral atualmente é ajustar vm.dirty_ratio
para 1% da RAM e vm.dirty_background_ratio
para 2%, o que para sistemas com menos de 64GB de RAM resulta em um comportamento equivalente ao que foi originalmente pretendido.
Algumas outras coisas para investigar:
- Tente aumentar um pouco o
vm.vfs_cache_pressure
sysctl. Isso controla a agressividade com que o kernel recupera memória do cache do sistema de arquivos quando precisa de RAM. O padrão é 100, não o reduza para nada abaixo de 50 (você irá obter um comportamento realmente ruim se você for abaixo de 50, incluindo condições OOM), e não o levará a muito mais do que 200 (muito maior, e o kernel perderá tempo tentando recuperar a memória que realmente não pode). Descobri que aumentar até 150 na verdade melhora visivelmente a capacidade de resposta, caso você tenha um armazenamento razoavelmente rápido.
- Tente alterar o modo de supercomprometimento de memória. Isso pode ser feito alterando o valor do
vm.overcommit_memory
sysctl. Por padrão, o kernel usará uma abordagem heurística para tentar prever a quantidade de memória RAM que pode realmente se comprometer. Configurar isto para 1 desativa a heurística e diz ao kernel para agir como se tivesse memória infinita. Configurar isso como 2 diz ao kernel para não se comprometer com mais memória do que a quantidade total de espaço de troca no sistema mais uma porcentagem da RAM real (controlada por vm.overcommit_ratio
).
- Tente ajustar o
vm.page-cluster
sysctl. Isso controla quantas páginas são trocadas de uma vez por vez (é um valor logarítmico de base 2, então o padrão de 3 é traduzido para 8 páginas). Se você estiver realmente trocando, isso pode ajudar a melhorar o desempenho de troca e saída de páginas.