/!\現在の状態: アップデート 4 /!\
一部の/proc/meminfo値は、他の値の合計または違いです。ただし、これら2つのリンクには計算方法の説明はあまりありません(ctrl-fを押すだけですmeminfo
)。
さらに、私はあちこちを掘り下げ、これまでに次のようなものを見つけました。
MemFree: LowFree + HighFree
Active: Active(anon) + Active(file)
Inactive: Inactive(anon) + Inactive(file)
他のフィールドに関する多くの情報が見つかりませんでした。
- /proc/meminfoでMemTotalを計算する方法 (2035272kB対予想2034284kB)
- /proc/meminfoのエントリ
これら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
しかし、私はコーダーではないので、これらの列挙型(inなど)とグローバル変数(totalram_pages
from si_meminfo
inなど)を特定するのは困難です。page_alloc.c#L4673)いっぱい。
アップデート2:
これで列挙部分が確認されていNR_LRU_LISTS
ます5
。
しかし、このtotalram_pages
部分は見つけるのが難しいようです...
アップデート3:
コードが複雑すぎて見えて読めないようです。誰かがこれを行い、/proc/meminfo
価値がどのように計算されるかを示したら、彼/彼女は賞金を得ることができます。
回答が詳細になるほど、賞金が高くなります。
アップデート4:
1年半が経過した後、この問題の原因の1つが実際に2019年8月についに発見された悪名高いOOM(Out of Memory)のバグに関連していることがわかりました。最低16年の"修正できないいくつかの有名なLinuxの専門家(Artem S Tashkinovにもう一度感謝します!:))がついにビエリートLinuxコミュニティの声を聞くまで「はい、LinuxはデスクトップのRAM/メモリ不足がないと正しく機能しません。」。
また、ほとんどのLinuxディストリビューションは実際書くことができるより正確に言えば、RAMはほとんど2017年頃のものです(この質問を受けた時点で私のディストリビューションは更新されませんでした)。カーネル修正が3.14(2014年3月)にリリースされ、より多くの手がかりを提供します。https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
ただし、OOMの問題は2021年にまだ存在し、いくつかのエッジ修正(およびearlyoom
)systemd-oomd
を適用しても、これらの発生頻度は実際には減少しました(および)。書くことができるRAMはまだ使用されている実際のRAMを正しく報告しません。
また、次の関連質問に回答がある可能性があります。
/proc/meminfo
したがって、価値を取得する方法に関する「アップデート3」のポイントはまだ有効です。
しかし、、次のリンクからOOMの問題についてのより多くの洞察を得ることができ、いくつかのGUIで提供される非常に有望なプロジェクトについても議論します! :https://github.com/hakavlad/nohang
私が行った最初のテストでは、このnohang
ツールは実際に約束したとおりですearlyoom
。
答え1
の含有量は、/proc/meminfo
次の式によって決定されます。meminfo_proc_show
fs/proc/meminfo.c
カーネルから。
計算は比較的簡単ですが、使用される情報のソースが必ずしも明確ではありません。たとえば、塗りつぶされた構造の値MemTotal
です。totalram
sysinfo
si_meminfo
存在するmm/page_alloc.c
。