Eu fiquei muito feliz com a suspensão para o disco. Mas ficando mais e mais RAM, isso não está realmente funcionando tão bem quanto costumava.
Suspender para o disco funciona bem: leva um minuto ou 2, que é o que eu esperaria, dado o desempenho de meus discos.
O problema é acordar após a suspensão: o disco demora uma eternidade para procurar, e ele lê apenas uma única página, resultando em uma taxa de entrada de menos de 1 MB / s.
Existe alguma maneira de eu pedir ao kernel para ler o próximo, digamos, 10 MB e oportunistamente trocar isso - em vez de apenas ler uma única página?
Se apenas uma única página dos 10 MB fosse necessária em breve, então não seria desperdiçada. E mesmo que a maioria dos 10 MB não seja necessária, as páginas continuarão limpas e podem ser simplesmente recuperadas como páginas livres - a cópia trocada não é tocada.
Exemplo
Isso ocupa 6,5G de RAM, usa essa memória ativamente e usa um núcleo completo em 100%:
perl -e 'while(1){for(1..25000000){$t{$_}++}}'
Antes de suspender para o disco:
total used free shared buffers cached
Mem: 8074280 7876864 197416 93460 169524 625912
-/+ buffers/cache: 7081428 992852
Swap: 8282108 8 8282100
A suspensão para o disco leva: 7m10s
O desempenho bruto do disco é de 50 MB / s.
Continuando do disco para quando a exibição está em execução, leva: 0m32s
Mas antes que o sistema reaja às teclas pressionadas, ele tem que trocar por um adicional: 2m02s
Neste momento, o uso da memória é assim:
total used free shared buffers cached
Mem: 8074280 2846392 5227888 74232 8312 157588
-/+ buffers/cache: 2680492 5393788
Swap: 8282108 5103264 3178844
Observe que o 6.5G completo que o programa perl usa não é trocado. Ele precisa de 4 a 5 GB a mais.
vmstat 1
informa que o sistema está trocando a uma taxa de 600 KB / s:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
0 2 3506124 1525652 27732 274036 632 0 632 0 228 740 6 1 50 44 0
iostats
informa que o disco está a 100% de utilização de E / S (provavelmente devido a procurar o tempo todo).
O programa perl
usa em torno de 0,3% da CPU, porque toda vez que faz alguma coisa, causa uma falha na página.
Continua a trocar por outro: 1h15m12s
E, finalmente, o programa perl
é completamente trocado e pode ser executado 100% novamente.
Então, o que eu gostaria, em vez disso, é que o swap em muito seja menor. E uma das maneiras de fazer isso é aumentar os 600 K / s trocando 10 MB de cada vez, em vez de apenas um único quadro de página.
Mas talvez haja outros parâmetros de ajuste, que farão a troca acontecer mais rapidamente.
( swapoff -a
seria uma opção no meu caso - troca 10 MB / s, mas não funciona, se houver mais de 8 GB trocados e, portanto, não é uma solução geral). / p>