Rastreando o uso de memória "ausente" no linux

7

Em um kernel 3.6.7 x86_64 do Arch Estou tentando explicar o uso de memória do sistema, quanto mais eu olho para ele, mais parece haver um furo (na contabilidade da memória usada, um não - buraco no uso de).

Este é um sistema recém-inicializado. Com poucas corridas além do systemd e do sshd para mantê-lo simples

$ ps aux | sort -n -k6
...
root       316  0.0  0.0   7884   812 tty1     Ss+  14:37   0:00 /sbin/agetty --noclear tty1 38400
matt       682  0.0  0.0  24528   820 pts/0    S+   15:09   0:00 sort -n -k6
dbus       309  0.0  0.0  17280  1284 ?        Ss   14:37   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
matt       681  0.0  0.0  10808  1364 pts/0    R+   15:09   0:00 ps aux
root       308  0.0  0.0  26060  1516 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-logind
root       148  0.0  0.0  25972  1692 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-udevd
matt       451  0.0  0.0  78180  2008 ?        S    14:37   0:00 sshd: matt@pts/0
root       288  0.0  0.0  39612  2708 ?        Ss   14:37   0:00 /usr/sbin/sshd -D
matt       452  0.0  0.0  16452  3248 pts/0    Ss   14:37   0:00 -bash
root         1  0.0  0.0  32572  3268 ?        Ss   14:37   0:00 /sbin/init
root       299  0.0  0.0  69352  3604 ?        Ss   14:37   0:00 /usr/sbin/syslog-ng -F
root       449  0.0  0.0  78040  3800 ?        Ss   14:37   0:00 sshd: matt [priv]
root       161  0.0  0.0 358384  9656 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-journald

A informação de memória mais detalhada que eu posso encontrar é esta de 2007, que parece ter resultado na adição do campo Pss ao kernel geral responsável por um processo, mas seu código python é para kernels mais antigos e, infelizmente, alguns dos arquivos / proc / k * desapareceram desde então. O /authorfo A documentação também é útil, mas envelhece um pouco também.

Então, uma demonstração do que estou vendo.

# cat /proc/meminfo
MemTotal:       16345780 kB
MemFree:        16129940 kB
Buffers:           10360 kB
Cached:            48444 kB
SwapCached:            0 kB
Active:            24108 kB
Inactive:          46724 kB
Active(anon):      12104 kB
Inactive(anon):     3616 kB
Active(file):      12004 kB
Inactive(file):    43108 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         11996 kB
Mapped:            16372 kB
Shmem:              3696 kB
Slab:              25092 kB
SReclaimable:      11716 kB
SUnreclaim:        13376 kB
KernelStack:         928 kB
PageTables:         2428 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172888 kB
Committed_AS:      34304 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      372788 kB
VmallocChunk:   34359362043 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

MemTotal - MemFree - Buffers - Cached = Used
16345780 - 16129940 - 10360 - 48444 = 157036

Todos os Active * / Inactive * parecem ser contadores aplicados em algumas páginas (não em todos), portanto, poderia duplicar o que é contado em outro lugar.

Active + Inactive = Used
46724  + 24108    = 70832 (not quite)

Commited_AS aqui parece acompanhar de perto a soma da memória privada / compartilhada do espaço de usuário, descontando os arquivos compartilhados de / proc / * / smaps. levando em conta o PSS também se alinha. (Por interesse eu recebo muito, muito maior Commited_AS em um 32bit debian 2.6.32-5-686)

AnonPages + Mapped + Commited_AS = Userspace?
11996     + 16372  + 34304       = 62672

Slab está alinhada com / proc / slabinfo

Slab +  Shmem + KernelStack + PageTables = Kernelspace?
25092 + 3696  + 928         + 2428       = 32144

Userspace? + Kernelspace? = Used?
62672      + 32144        = 94816

Então ~ 63M curto. Parece-me que o kernel e todos os módulos carregados não possuem alguns MB's. A laje parece cobrir muito, então, se houver alguma falta, não tenho certeza se isso equivaleria a ~ 60Mb?

63 é um pouco próximo do ativo + Inativo, mas isso não parece certo.

Então alguém conhece a fórmula mágica? Caso contrário, se a figura que estou olhando for a correta, quais são as áreas cinzas na alocação de memória em que posso falar?

Parece que o linux comeu meu carneiro! Embora uma porção menor do que normalmente acusado de =)

edit Commited_AS é uma estimativa do kernel de quanta memória seria necessária para cobrir 99,9% do que foi confirmado, então não é um número real alocado. AnonPages + Mapped é um componente dele, de modo que deixa um buraco maior, cerca de 100MB agora.

User + Kernel
28368 + 32144 = 60512 != 157036

AnonPages e Mapeado geralmente rastreiam com informações anônimas / mapeadas de / proc / [0-9] * / smaps wgen levando em conta o PSS / Shared.

As áreas reservadas aparecem para todos se encaixam no pedaço retirado da memória total:

O total da memória free é 16345032Kb
Memória total do sistema é 16777216Kb
'Buraco' PCI - lspci -v 266520K = 16510696K
Bios Reservados - dmesg 92793K = 16417903K

edit2 Notei que esse uso extra de memória não estava na VM em execução na caixa original da qual o /proc/meminfo era. Então comecei a procurar o que era diferente entre os dois. Eventualmente, descobriu-se que um aumento na memória física total disponível coincidiu com o aumento da memória usada.

phys 16GB used>144508     vm>50692      user>21500      kern>26428      u+ktot>47928
vm   64MB used>24612      vm>31140      user>14956      kern>14440      u+ktot>29396
vm  256MB used>26316      vm>35260      user>14752      kern>14780      u+ktot>29532
vm    1GB used>33644      vm>35224      user>14936      kern>14772      u+ktot>29708
vm    2GB used>41592      vm>35048      user>14736      kern>15056      u+ktot>29792
vm    4GB used>57820      vm>35232      user>14780      kern>14952      u+ktot>29732
vm    8GB used>82932      vm>36912      user>15700      kern>15388      u+ktot>31088
vm   12GB used>110072     vm>35248      user>14812      kern>15624      u+ktot>30436
vm   15GB used>122012     vm>35424      user>14832      kern>15824      u+ktot>30656

Isso funciona como ~ 8Mb alocado para cada 1GB de memória. Pode ser um mapa de memória no kernel ... mas eu pensei que isso só cresceria quando a memória fosse alocada ao invés de ser configurada na inicialização.

Seria interessante ver se alguém tem acesso a máquinas bigmem se a tendência continuar?

    
por Matt 27.11.2012 / 15:34

1 resposta

1

A "memória usada por um processo" não é um conceito claro em sistemas operacionais modernos. O que pode ser medido é o tamanho do espaço de endereçamento do processo (SIZE) e o tamanho do conjunto residente (RSS, quantas das páginas no espaço de endereço estão atualmente na memória). Parte do RSS é compartilhada (a maioria dos processos na memória compartilha uma cópia do glibc e, portanto, para diversas outras bibliotecas compartilhadas; vários processos executando o mesmo executável compartilham, processam dados de leitura compartilhada do compartilhamento e possivelmente um pedaço de dados ainda não modificados) ler e gravar dados com o pai). Por outro lado, a memória usada para o processo pelo kernel não é contabilizada, como tabelas de páginas, buffers de kernel e pilha de kernel. No quadro geral, você deve considerar a memória reservada para a placa gráfica, o uso do kernel e vários "buracos" reservados para o DOS e outros sistemas pré-históricos (isso não é muito, de qualquer forma).

A única maneira de obter uma visão geral é o que o kernel relata como tal. Somando números com sobreposições desconhecidas e saídas desconhecidas é um bom exercício de aritmética, nada mais.

    
por 03.02.2013 / 17:26

Tags