Como posso descobrir os processos que estão usando o espaço de troca?

9

Eu tenho um top report sobre 9GB de swap usado pelo servidor linux:

Mas não consigo imaginar onde é o uso de swap, alguns resultados do google disseram que top - O commad seguido por p mostrará o uso de swap por processo. Mas, como mostrado na imagem acima, tirar uma breve soma da coluna SWAP mostra que > São usados 10 GB de swap, de onde vem o valor de 9 GB para o uso de swap?

Os principais relatórios informam que cerca de 96492kb de memória RAM são usados pelos buffers. Existe alguma coisa que eu possa fazer para utilizar isso, em vez de usar swap?

    
por secmask 21.06.2011 / 10:34

4 respostas

6

É possível que vários programas usem a mesma área de troca, então será relatado duas vezes.

Não há necessidade de tentar dizer ao Linux para usar a área em buffer em vez de trocar - já é muito inteligente sobre o que está fazendo. Se você está usando 9gb de swap e 9gb de buffer, isso é uma coisa boa ... isso significa que o Linux percebe que 9gb de material carregado na memória não está sendo usado ativamente, então é mais eficiente trocá-lo para o disco para que seu o buffer pode crescer e melhorar seu desempenho.

EDITAR: Se você adicionar toda a memória usada por cada processo, você terá muito mais do que a sua RAM física também. Isso ocorre porque as bibliotecas compartilhadas estão sendo usadas por vários programas, assim como a forma como o Linux lida com os garfos - ele não duplica todo o programa na memória, apenas duplica as partes que diferem entre as duas instâncias. Em alguns casos, a memória de vídeo pode ser mostrada como parte de um processo X - acho que as antigas placas Voodoo3 fizeram isso. Pode haver outros casos em que a memória "fantasma" também pode aparecer no topo.

    
por 21.06.2011 / 10:47
3

Analisando o subdiretório / proc funciona:

Como um script bash:

for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done

A saída pode ser classificada como Hi-Lo pela tubulação para ordenar:

{blah}| sort -rn

Claro, reescreva isso na sua língua favorita da semana como desejar. Meu Awk-fu não é strong.

(cut-n-pastável)

#!/bin/bash
#
# show swap used by processes
#
(for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done ) | sort -nr
    
por 10.11.2011 / 00:11
2
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less

de: link

    
por 04.07.2014 / 11:27
1

Forma alternativa:

smem -s swap -r
    
por 24.10.2016 / 12:35