htop relatando uso de memória muito mais alto que o livre ou o superior

6

As três saídas a seguir foram tiradas essencialmente simultaneamente:

top:

top - 02:54:36 up 2 days, 13:50,  3 users,  load average: 0.05, 0.05, 0.09
Tasks: 181 total,   1 running, 179 sleeping,   0 stopped,   1 zombie
%Cpu(s):  2.5 us,  0.8 sy,  0.0 ni, 96.6 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  16158632 total, 11234480 used,  4924152 free,      844 buffers
KiB Swap: 16777212 total,        0 used, 16777212 free, 10640832 cached

free -h:

             total       used       free     shared    buffers     cached
Mem:           15G        10G       4.7G         0B       844K        10G
-/+ buffers/cache:       578M        14G
Swap:          15G         0B        15G

htop:

livre e superior parecem concordar. No topo há 11234480 KiB usado, subtraindo 10640832 KiB em cache dá 579.7 MiB, o que é bem próximo do que relatórios livres sob buffers / cache usados +/-.

No entanto, o htop está relatando 1836 (MiB) usado, o que não é nem aqui nem lá, tanto quanto eu posso ver. De onde vem essa diferença? O htop claramente não inclui os dados em cache, mas ainda está relatando mais de três vezes o uso de memória de livre ou superior.

Estou ciente de que há muitas perguntas semelhantes, mas não encontrei uma que explique essa discrepância (a confusão geralmente parece ser apenas a contagem de cache com / sem).

Editar: devo mencionar que estou executando o openSUSE e vejo o mesmo tipo de discrepância nas versões 12.2 e 12.3 RC1.

Edit2: A versão incluída do htop é 1.0.1. Eu também compilei a versão 1.0.2 da fonte e vejo a mesma discrepância então.

    
por Quantumboredom 23.02.2013 / 03:15

1 resposta

10

Uma reescrita completa do meu post anterior. Fiquei um pouco curioso e verifiquei mais.

Em suma: a razão para a diferença é que o openSUSE usa uma versão corrigida de top e free que adiciona alguns valores extras para 'cache' .

A) Versão padrão

top, free, htop , ...:

O uso é calculado pela leitura de dados de /proc/meminfo :

Por exemplo:

#free:
Row   Column  | Corresponding /proc/meminfo entry
-----|--------|----------------------------------
Mem:

      total   : MemTotal
      used    : MemTotal - MemFree
      free    : MemFree
      shared  : MemShared
      buffers : Buffers
      cached  : Cached
-----|--------|----------------------------------
-/+ buffers/cache:

      used    : (MemTotal - MemFree) - (Buffers + Cached)
      free    :  MemFree             + (Buffers + Cached)

#htop:
    Used U*   : ((MemTotal - MemFree) - (Buffers + Cached)) / 1024

* Eu estou usando o nome Used U para a memória usada pelo modo do usuário. Aka Usado menos (em cache + buffers) .

Então, na realidade, o mesmo cálculo é usado.

htop exibe o seguinte no medidor de memória:

[Used U % of total | Buffers % of total | Cached % of total ] UsedU MB

(MB é na verdade MiB.)

B) Versão corrigida

A base para free e top no Debian, Fedora, openSuse é procps-ng . No entanto, cada sabor adiciona suas próprias manchas que podem, ou não, tornar-se parte do projeto principal.

Em openSUSE encontramos várias adições ao pacote top / free (procps). Os que devem ser notados aqui são alguns valores adicionais usados para representar o valor do cache. (eu não incluí no meu post anterior como meu sistema usa um procedimento "limpo".)

B.1) Adições

Em / proc / meminfo temos Slab que é um dado do kernel cache de estrutura. Como subcategoria, encontramos SReclaimable que faz parte do Slab que pode ser recuperado para outro uso tanto pelo Kernel como pelo Modo de Usuário.

Além disso, temos SwapCached , que é a memória que uma vez foi trocada, é trocado, mas também está no arquivo de troca. Assim, se é preciso trocá-lo mais uma vez, isso já está feito.

Por fim, há NFS_Unstable , que são páginas enviadas ao servidor, mas ainda não comprometida com o armazenamento estável.

Os seguintes valores são adicionados a cache na versão corrigida do openSUSE:

SReclaimable
SwapCached
NFS_Unstable

(Além disso, existem alguns cheques que o total tem que ser maior do que livre, usado tem que ser maior que buffers + cache, etc.)

B.2) Resultado

Olhando para free , como resultado, os seguintes valores são os mesmos: total, used, free and buffers .

Os seguintes são alterados: cached and "+/- buffers" .

used    = MemTotal - MemFree

old:
    cached         : Cached
    +-/buffers-used: used - (Buffers + Cached)
    +/-buffers-free: free + (Buffers + Cached)

patched:
    cached         : Cached + SReclaimable + SwapCached + NFS_Unstable
    +/-buffers-used: used - (Buffers + Cached + SReclaimable +
                     SwapCached + NFS_Unstable)
    +/-buffers-free: free + (Buffers + Cached + SReclaimable +
                     SwapCached + NFS_Unstable)

As mesmas adições são feitas para topo .

htop é inalterado e, portanto, apenas o alinhamento com versões mais antigas / não corrigidas de topo / livre.

    
por 23.02.2013 / 10:05