No meu sistema, tenho alguma quantidade de swap usada:
undefine@uml:~$ free
total used free shared buffers cached
Mem: 16109684 15848264 261420 633496 48668 6096984
-/+ buffers/cache: 9702612 6407072
Swap: 15622140 604 15621536
Como verificar o que está em troca?
Eu tento verificá-lo através de processos, mas para cada pid no sistema, o VmSwap é 0:
undefine@uml:~$ awk '/VmSwap/ {print $2}' /proc/*/status |uniq
0
O que mais pode haver em troca? Pensei no tmpfs - mas reli todos os arquivos no tmpfs-es - e ele não libera o tamanho da troca.
VmSwap
linha em/proc/PID/status
? A pergunta não está pedindo uma exibição mais bonita, está perguntando o que poderia estar na troca, além dos dados do processo.Ontem só comecei a pesquisar minhas necessidades, abaixo está o que encontrei até agora:
SWAP_USED = Used_by_Processes + SwapCached + Part_of_Tmpfs + something_else
História curta:
Used_by_Processes - dados que foram trocados completamente da memória.
SwapCached - dados que foram trocados para o disco, mas ainda permanecem na memória.
Part_of_Tmpfs - alguma parte dos dados tmpfs.
Longa história:
Used_by_Processes - existem muitas instruções publicadas sobre como calcular incorretamente este;) Por exemplo, se somarmos todas as
VmSwap
entradas/proc/*/status
ouSwap
entradas de/proc/*/smaps
- obteremos uma superestimação (as páginas trocadas compartilhadas podem ser contadas mais de uma vez). Se não o executarmos doroot
usuário ou do nosso sistema operacional - a subestimação será retornada silenciosamente. Não tenho uma maneira adequada de identificar páginas compartilhadas, mas o respingo dos mesmos 'mapas' oferece uma aproximação muito melhor do que outras abordagens: (observe quecat
abaixo não é inútil e realmente precisa de2>/dev/null
)SwapCached - este é simples e pode ser extraído de forma limpa
/proc/meminfo
. Algumas pessoas não esperariam que isso fosse contado como swap "usado", pois uma cópia duplicada (não suja) da mesma página na RAM e no Swap pode ser liberada de ambos os lados instantaneamente (no caso de demanda), tornando uma das cópias "liberadas".Part_of_Tmpfs - o lado positivo é que quando todos os dados do seu tmpfs estão intocados por muitos dias e
swappiness
não são zero - é bem provável que tmpfs inteiros sejam trocados (e vice-versa para dados usados recentemente). A desvantagem é que eu não encontrei nenhuma API para calcular com segurança o limite ou a porcentagem de quanto é trocado, embora se houver RAM suficiente - podemos copiar dados tmpfs inteiros/dev/null
e, assim, ter uma idéia de quanto foi trocado.Os erros mais comuns cometidos durante o cálculo do tamanho dos tmpfs são - supondo que esse
/dev/shm
seja o único tmpfs configurado ou tentando fazê-lo através da varredura recursiva por arquivo (não apenas as implementações tendem a omitir arquivos ocultos ou nãoroot
, mas também desassociam algumas páginas durante a travessia). Uma maneira muito mais fácil é usar o bom e velhodf
.something_else - veja o "
diff 385 MB
" abaixo, precisa mergulhar nas fontes do kernel. Veja meu script:e a saída de caixas diferentes:
E um pequeno experimento como bônus:
PS, além da aproximação mencionada acima - existem outras fontes de erro, como arredondamento de KB para MB, possibilidade teórica de incompatibilidade entre o tamanho dos blocos de RAM e Swap, etc. Não tenho certeza de que cubra tudo, mas espero que isso ajuda até certo ponto :)
fonte