Você quer poucas coisas. Primeiro você quer reduzir o swappiness
sysctl -w vm.swappiness=10
Isso salvará algum disco IO; porque a última coisa que você precisa é de gravações adicionais em disco quando o kernel tenta mostrar algumas coisas da mem. O objetivo é sintonizar as coisas, pois é necessária pouca troca. No entanto, não desligue o swap, definindo-o como 0 ou desativando. Eu recomendaria a ação extrema para ir tão longe como a configuração de swappiness para 1. Se você observar a saída do dstat por um tempo, você notará rapidamente quantos dados realmente são gravados e lidos a partir da troca.
Agora existe um mecanismo nos novos kernels (3.2+) chamado throttling writeback . Para poder usá-lo como você disse, você precisa ajustar as taxas de sujeira. Verifique para mais detalhes este link . Cite de lá que lhe interessa é
Once dirty_ratio (resp. dirty_bytes) limit is hit then the process which
writes gets throttled.
Portanto, por padrão, dirties são bastante altos, especialmente se você tiver muita memória e subsistema de disco lento. Então você precisa ajustá-los; o mais baixo possível para não afetar o uso normal * e ainda assim o valor ditará o volume de dados que existirão na memória antes do kernel gerar processos para gravar isso no disco, quando a situação de gargalo do IO do disco começar a ocorrer. Nesse ponto, você quer que o processo seja acelerado, o que o kernel faz com a injeção inativa nele.
* para descobrir o que é uso normal; Eu recomendaria instalar no topo e observar o que está acontecendo lá; você deseja verificar os números de dirty
lá e ver a visão geral D, onde as leituras / gravações de disco são rastreadas. Existe coluna WCANCL; Estas são, na verdade, gravações que foram manipuladas na memória e nunca foram necessárias para serem gravadas no disco (páginas sujas), mas para alguns dados temporários. O Mysql tem aqueles quando ele faz consultas complexas, compilador ao fazer um monte de pequenos arquivos obj que não serão necessários por muito tempo etc ...
Além disso, pode ajudar a alternar para o agendador de disco de prazo final e ajustar a afinidade de leituras x gravações para ajustar melhor seu ambiente. por exemplo. se você fizer 10x mais leituras que as gravações, talvez queira definir
/sys/block/<device>/queue/iosched/writes_starved
para 5, em vez de padrão 2. Configuração mais alta
/sys/block/<device>/queue/iosched/write_expire
também ajudará. Além disso, você pode ganhar alguma latência se diminuir o número de
solicitações feitas em lote de 128
para dizer 32
/sys/block/<device>/queue/nr_requests