Quais são as condições exatas com base nas quais o Linux troca a memória do (s) processo (s) da RAM para um arquivo de troca?

7

Meu servidor tem 8Gigs de RAM e 8Gigs configurados para arquivo de troca. Eu tenho aplicativos intensivos de memória em execução. Esses aplicativos têm cargas de pico durante os quais encontramos aumento do uso de swap. Aproximadamente 1 GIG de swap é usado.

Eu tenho outro servidor com 4Gigs de RAM e 8 Gigs de swap e aplicativos similares que fazem uso intensivo de memória. Mas aqui o uso de swap é muito insignificante. Cerca de 100 MB.

Eu queria saber quais são as condições exatas ou uma fórmula aproximada com base na qual o Linux fará uma troca de uma memória de processo na RAM para o arquivo de troca. Eu sei que é baseado no fator de permuta. Em que mais se baseia? Trocar o tamanho do arquivo? Qualquer ponteiro para a documentação interna do kernel kernal / código fonte explicando isso será ótimo.

    
por Zenil 08.01.2010 / 17:26

4 respostas

4

O subsistema VM de um kernel Linux é uma besta muito complicada, o kernel usa heurísticas e algoritmos para determinar quais páginas trocar e retirar quando e para fazer isso. Eu não acho que existe uma fórmula simples que é capaz de descrever como e quando as páginas estão sendo colocadas em disco. Talvez este artigo do LWN seja útil para você:

link

    
por 08.01.2010 / 17:38
2

Como você provavelmente sabe, o kernel do Linux usa o máximo de memória possível para armazenar as coisas em cache. É por isso que a saída do free parece que estou quase sem memória, de acordo com a linha de cima:

 $ free -m
              total       used       free     shared    buffers     cached
 Mem:          3168       2963        205          0        155       1263
 -/+ buffers/cache:       1543       1624
 Swap:          494         86        407

mas a parte importante é a quantidade de RAM que os buffers e o cache não estão usando

 -/+ buffers/cache:       1543       1624

Ainda assim, todos os 205 MB de memória são usados nesse exemplo, mesmo que seja por cache. Como foi explicado para mim (ou pelo menos, como eu entendi), se um programa de repente pede > 205 MB de memória, esse pedaço sai da troca, para que o processo possa ter o pedaço de memória, então ele sai da troca uma vez que ele tenha uma chance de liberar memória sendo usada pelo cache.

Como pfo mencionado, os mecanismos subjacentes são complexos e muito além do meu entendimento. Perguntei a Ted Ts'o quase uma pergunta idêntica em uma aula que ele estava dando na LISA, e dei-lhe essencialmente a mesma resposta que ele me deu, ou pelo menos como eu entendi.

Por acaso, eu suspeito que a memória "usada" na troca não seja realmente usada por qualquer coisa neste momento, mas que ela ainda não foi liberada ainda.

    
por 08.01.2010 / 17:58
2

Expandindo a resposta do pfo, um fornecedor também pode pré-ajustar seu (s) kernel (s) implementado (s) para lidar com o swappiness de uma certa maneira. Em um sistema Red Hat você pode configurar muito disso em /etc/sysctl.conf - configurações do Google up como:

vm.swappiness
vm.vfs_cache_pressure

Ao ajustar cuidadosamente o swappiness do sistema para as necessidades específicas do seu aplicativo, você poderá reduzir o uso do swap nesse computador de 8GB. Eu tenho uma nota em meus arquivos que diz para vm.swappiness "uso da memória de swap por padrão no Kernel 2.6.xx é definido como 60%" mas não salvou o link onde eu li isso, então pegue com um grão de sal. :)

    
por 08.01.2010 / 19:48
1

Analisamos esse problema nos servidores de aplicativos de produção do JBoss na AWS.

Eu faria diff sysctl -a ambos os sistemas.

1) Para servidores, configure o vm.swappiness para perto de 0. Isso prefere manter coisas na memória.

2) Ative um pequeno arquivo de troca em todos os servidores para que você possa monitorar o carregamento real da memória. (Verifique a troca usada%).

3) Monitorar falhas de página (nFLT) com Cactos ou similares.

4) Verifique ulimits.

5) Sintonize com base no desempenho mensurável do aplicativo.

    
por 08.01.2010 / 21:38