web-dev-qa-db-ja.com

/ proc / meminfoの値はどのように計算されますか?

/!\現在の状態:アップデート3 /!\

一部の/ proc/meminfo値は、他のいくつかの値の合計または差です。ただし、これらの2つのリンクでそれらがどのように計算されるかについてはあまり言及されていません(そこにアクセスするには、ctrl-f meminfoを実行してください)。

さらに、私はあちこちで掘りましたが、ここに私がこれまでに見つけたものがあります:

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

他のフィールドについてはあまり知りませんでしたが、私が見つけた場所では、これらのスタックオーバーフローの投稿のように結果が一致しません。

これらの2つの値は正しく計算されていますか?それとも外部の手段によるばらつきがあるのでしょうか?

また、一部の値は、当然のことながら、外部値なしでは計算できませんが、それでも興味があります。

/proc/meminfoの値はどのように計算されますか?


それが役立つ場合は、/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:

更新1

/proc/meminfoがデータを入力するために使用するコードは次のとおりです。

http://elixir.free-electrons.com/linux/v4.15/source/fs/proc/meminfo.c#L46

しかし、私はコーダーではないので、これらの列挙型(たとえば、NR_LRU_LISTSなど)およびグローバル変数(たとえば、totalram_pagesからのsi_meminfoの場所 page_alloc.c)の場所を見つけるのに苦労しています。 #L4673 )が入力されています。

更新2

Enums部分が解決され、NR_LRU_LISTS5と等しくなります。

しかし、totalram_pagesの部分は見つけるのが難しいようです...

更新3

非常に複雑に見えるため、コードを読み取ることができないようです。誰かがなんとかそれを実行し、/proc/meminfoの価値がどのように計算されるかを示した場合、彼/彼女は報奨金を持つことができます。

答えが詳細であるほど、賞金は高くなります。

4
X.LINK

/proc/meminfoの内容は meminfo_proc_showfs/proc/meminfo.cのカーネル によって決定されます。

計算はすべて比較的簡単ですが、使用される情報源は必ずしもそれほど明白ではありません。たとえば、MemTotaltotalram構造体のsysinfo値です。 si_meminfo in mm/page_alloc.c で埋められます。

6
Stephen Kitt