O kernel do Linux troca a maioria das páginas da memória quando executo um aplicativo que utiliza a maioria dos 16 GB de memória física. Após o término do aplicativo, todas as ações (digitando comandos, alternando áreas de trabalho, abrindo uma nova página da web etc.) levam muito tempo para serem concluídas porque as páginas relevantes primeiro precisam ser lidas novamente no swap.
Existe uma maneira de dizer ao kernel do Linux para copiar as páginas da troca novamente para a memória física sem tocar manualmente (e aguardar) em cada aplicativo? Eu executo muitos aplicativos, portanto a espera é sempre dolorosa.
Costumo usar swapoff -a && swapon -a
para tornar o sistema responsivo novamente, mas isso limpa as páginas da troca, portanto elas precisam ser gravadas novamente na próxima vez que executar o script.
Existe uma interface do kernel, talvez usando sysfs, para instruir o kernel a ler todas as páginas do swap?
Edit: Na verdade, estou procurando uma maneira de fazer todos os swap swapcached. (Obrigado derobert!)
[PS serverfault.com/questions/153946/… e serverfault.com/questions/100448/… são tópicos relacionados, mas não abordam a questão de como fazer com que o kernel Linux copie as páginas do swap de volta para a memória sem limpar a troca.]
Respostas:
Baseado no programa memdump originalmente encontrado aqui , criei um script para ler seletivamente os aplicativos especificados de volta à memória.
remember
:Uso: algo como
Ele pula rapidamente a memória não trocada (gigabytes por segundo) e diminui a velocidade quando a troca é necessária.
fonte
Pode ajudar a ativar
/proc/sys/vm/page-cluster
(padrão: 3).Na documentação do kernel (
sysctl/vm.txt
):A documentação não menciona um limite, portanto, você pode definir um valor absurdamente alto para fazer com que toda a troca seja lida em breve. E, é claro, volte a um valor sensato depois.
fonte
page-cluster
valor poderá melhorar o desempenho.Você pode tentar adicionar os programas mais importantes a um cgroup e ajustar a alternância, para que na próxima vez que o aplicativo execute os programas adicionados, seja menos provável que sejam candidatos à troca.
Algumas de suas páginas provavelmente ainda serão trocadas, mas isso pode solucionar seus problemas de desempenho. Uma grande parte provavelmente é apenas o comportamento de "parar e iniciar" quando muitas páginas de um programa estão em troca e o programa precisa pausar continuamente para trocar suas páginas na RAM, mas apenas em incrementos de 4k.
Como alternativa, você pode adicionar o aplicativo que está sendo executado a um cgroup e ajustar a troca, para que o aplicativo seja o que mais tende a usar o arquivo de troca. Isso desacelerará o aplicativo, mas poupará o resto do sistema.
fonte
Parece-me que você não pode magicamente "tornar o sistema responsivo novamente". Você incorre na penalidade ou lê as páginas de volta do espaço de troca na memória agora ou incorre mais tarde, mas de uma forma ou de outra incorre. De fato, se você fizer algo assim
swapoff -a && swapon -a
, poderá sentir mais dor do que menos, porque força algumas páginas a serem copiadas de volta para a memória que, de outra forma, nunca seriam necessárias novamente e eventualmente caíram sem serem lidas (pense: você saiu de um aplicativo enquanto grande parte de sua pilha é trocada; essas páginas podem ser descartadas completamente sem nunca serem lidas na memória).Bem, praticamente qualquer página que é copiada de volta do swap para a memória principal está prestes a ser modificada de qualquer maneira, portanto, se alguma vez precisar ser movida novamente para trocar novamente no futuro, ela terá que ser escrita novamente no swap de qualquer maneira. Lembre-se de que swap é principalmente memória de pilha, e não páginas somente leitura (que geralmente são suportadas por arquivos).
Eu acho que seu
swapoff -a && swapon -a
truque é tão bom quanto qualquer coisa que você possa inventar.fonte
swapoff -a && swapon -a
não será bom para você. Acho que nesse caso você precisaria de algo que digitalize/proc/<each-process>/mem
e leia cada página da memória para garantir que ela exista na RAM. Não sei se isso existe.Há uma discussão muito boa aqui http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that que se resume à diminuição da troca, com a idéia de que, para aumentar a capacidade de resposta percebida do sistema, deve-se evitar a troca do código (e é isso que acontece). Essa não é realmente uma resposta para sua pergunta, mas isso pode impedir que o problema apareça (seus aplicativos simplesmente não são trocados, apenas dados não utilizados e cache de página)
fonte