Como os valores de / proc / meminfo são calculados?

4

/! \ Estado atual: Atualização 3 /! \

Alguns valores / proc / meminfo são uma soma ou uma diferença de alguns outros valores. No entanto, não se fala muito sobre como eles são calculados nesses dois links (apenas faça ctrl-f meminfo para chegar lá):

Além disso, eu também pesquisei aqui e ali, e aqui está o que eu encontrei até agora:

MemFree:              LowFree + HighFree
Active:               Active(anon) + Active(file)
Inactive:             Inactive(anon) + Inactive(file)

Eu não encontrei muito sobre os outros campos, e onde eu tenho, os resultados não correspondem, como nestes posts do Stack Overflow:

Esses dois valores são calculados corretamente? Ou existe alguma variabilidade devido a algum meio externo?

Além disso, alguns valores não podem, obviamente, ser calculados sem valores externos, mas ainda estou interessado nisso.

Como são calculados os valores de /proc/meminfo ?

Se isso ajudar, veja um exemplo de /proc/meminfo :

MemTotal:         501400 kB
MemFree:           38072 kB
MemAvailable:     217652 kB
Buffers:               0 kB
Cached:           223508 kB
SwapCached:        11200 kB
Active:           179280 kB
Inactive:         181680 kB
Active(anon):      69032 kB
Inactive(anon):    70908 kB
Active(file):     110248 kB
Inactive(file):   110772 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:
HighFree:
LowTotal:
LowFree:
MmapCopy:
SwapTotal:        839676 kB
SwapFree:         785552 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:        128964 kB
Mapped:            21840 kB
Shmem:              2488 kB
Slab:              71940 kB
SReclaimable:      41372 kB
SUnreclaim:        30568 kB
KernelStack:        2736 kB
PageTables:         5196 kB
Quicklists:
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1090376 kB
Committed_AS:     486916 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        4904 kB
VmallocChunk:   34359721736 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:
ShmemPmdMapped:
CmaTotal:
CmaFree:
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       36800 kB
DirectMap2M:      487424 kB
DirectMap4M:
DirectMap1G:

Atualização 1 :

Este é o código usado por /proc/meminfo para preencher seus dados:

link

No entanto, como não sou de um codificador, estou tendo dificuldades para descobrir onde essas enums (por exemplo, NR_LRU_LISTS , etc) e variáveis globais (por exemplo, totalram_pages de si_meminfo in < href="http://elixir.free-electrons.com/linux/v4.15/source/mm/page_alloc.c#L4673"> page_alloc.c # L4673 ) estão preenchidos.

Atualização 2 :

A parte enums está agora resolvida e NR_LRU_LISTS é igual a 5 .

Mas a parte totalram_pages parece ser mais difícil de descobrir ...

Atualização 3 :

Parece que não vou conseguir ler o código, pois parece muito complexo. Se alguém conseguir fazer isso e mostrar como /proc/meminfo valures são calculados, ele / ela pode ter a recompensa.

Quanto mais detalhada for a resposta, maior será a recompensa.

    
por X.LINK 31.01.2018 / 02:14

1 resposta

6

O conteúdo de /proc/meminfo é determinado por meminfo_proc_show in fs/proc/meminfo.c no kernel .

Os cálculos são relativamente diretos, mas as fontes de informação usadas não são necessariamente tão óbvias. Por exemplo, MemTotal é o valor totalram da estrutura sysinfo ; isso é preenchido por si_meminfo in mm/page_alloc.c .

    
por 31.01.2018 / 06:41