O uso de swap do processo do Linux é maior que o uso geral do swap do sistema

2

Eu tenho um problema estranho que quando eu executo top comando mostra que alguns processos estão usando cerca de 1,5 GB de espaço de swap, mas o uso geral da troca do sistema é muito menos para algo em torno 117MB, então porque é isso? Eu pensei que o uso geral do swap do sistema é o uso agregado de todos os processos, o que não parece ser verdade neste caso. Aqui está a saída:

Tasks: 392 total,  16 running, 373 sleeping,   0 stopped,   3 zombie
Cpu0  : 95.1%us,  4.9%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  : 98.0%us,  2.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  : 91.1%us,  6.9%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  2.0%si,  0.0%st
Cpu3  : 95.0%us,  3.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  2.0%si,  0.0%st
Mem:   4148160k total,  4007820k used,   140340k free,    15968k buffers
Swap:  4096552k total,   117584k used,  3978968k free,  2909396k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND                                                                                                          
 5784 apache    18   0 1567m 5772 4568 S  0.0  0.1   0:00.03 1.5g C:\windows\system32\explorer.exe /desktop                                                                         
 5776 apache    25   0 1558m 2564 2124 S  0.0  0.1   0:00.00 1.5g C:\windows\system32\winedevice.exe MountMgr                                                                        5774 apache    25   0 1558m 2324 1928 S  0.0  0.1   0:00.00 1.5g C:\windows\system32\services.exe                                                                                  
 9395 apache    15   0 90536 2988 1340 S  0.0  0.1   0:00.00  85m /usr/sbin/httpd                                                                                                   
 9419 apache    18   0 90536 2988 1340 S  0.0  0.1   0:00.00  85m /usr/sbin/httpd                                                                                                   
27016 apache    18   0 91520 4000 2964 S  0.0  0.1   0:00.04  85m /usr/sbin/httpd                                                                                                   
 7773 apache    16   0 91012 3592 1464 S  0.0  0.1   0:07.04  85m /usr/sbin/httpd   
    
por Imran Imtiaz 31.01.2013 / 16:55

2 respostas

6

Top (pelo menos em algumas versões) calcula SWAP por processo como VIRT - RSS, em vez de relatar o uso de troca real. No Linux, o resultado é um número completamente sem sentido.

    
por 31.01.2013 / 17:08
3

Resposta curta

A coluna SWAP em top é o cálculo (aproximadamente) do uso do processo de troca e de qualquer arquivo mapeado e / ou objetos compartilhados usados por este processo . Os arquivos mapeados não fazem parte do swap , são arquivos lidos pelo processo de uma certa maneira e os objetos compartilhados são bibliotecas dinâmicas (.so) ou blocos de memória compartilhados entre processos.

Portanto, se dois processos compartilharem um grande espaço de memória juntos, ele será contado duas vezes em top uma vez para cada processo. Esse pedaço de memória (se houver memória livre suficiente e se estiver ativa) pode não estar na troca. Esse pedaço de memória é "reservado" para o processo, não significa que seja usado inteiramente, por isso não está necessariamente ocupando muita RAM física.

A página man afirma: "O SWAP é calculado subtraindo a memória física da memória virtual ". O valor computado não deve depender, a menos que você seja um desenvolvedor (e saiba o que está fazendo), para os usuários casuais isso não tem um significado real, veja abaixo o motivo.

Resposta longa, o que é a memória virtual e os arquivos mapeados?

Nota: VIRT significa memória virtual.

Memória virtual do processo Linux

Cada processo no Linux (e isso como similaridades em muitos sistemas Unix também) é alocado em um espaço de endereço virtual. Em um sistema de 32 bits, esse espaço de endereço virtual é de até 4GiB (2 ^ 32). Em um sistema de 64 bits. esse espaço de endereço virtual é de até 256TiB (2 ^ 48 sim, um sistema de bases de 64 bits usando a extensão atual de 64 bits da AMD64 ou Intel pode somente endereçar 48 bits de memória).

Cada memória virtual do processo contém o espaço do kernel e a área do espaço do usuário. Em um sistema de 32 bits, os splits dependem se o PAE está ativado ou não, então pode ser 3GiB / 1GiB ou 2GiB / 2GiB. Em 64 bits, é sempre (AFAIK) metade / metade, portanto, os primeiros 47 bits (128 TBB) são para o espaço do usuário e, no final da área de 64 bits, há 128 TBb reservados para o kernel.

A memória virtual compreende o código, dados e BSS do processo em execução, inclui ainda a pilha e o heap, e a área de mapeamento de memória. Esta área contém qualquer memória compartilhada (IPC, objetos compartilhados) e também pode conter o arquivo (AFAIK) mapeado na memória. Veja este gráfico que fiz para o sistema de 64 bits .

Mais algumas informações sobre arquivos mapeados

É possível mapear arquivos maiores que a memória disponível, para que o tamanho da VIRT possa ser maior que a memória. O kernel é inteligente o suficiente para carregar / descarregar os dados do armazenamento para a memória para acelerar a E / S tanto quanto a RAM física livre disponível permitir.

Você não deve se importar como usuário sobre o tamanho da VIRT. Isto é principalmente destinado a desenvolvedores (hard core).

Em conclusão , a coluna SWAP calcula a memória virtual menos a memória física (mais do que provavelmente RSS), isso provavelmente inclui a parte de troca usada e qualquer arquivo mapeado que também esteja no disco.

    
por 11.02.2013 / 17:10