[英]How to query kernel memory pool status without triggering OOM killer?
我知道 kernel 會在觸發 OOM Killer 時向 kernel 日志發出詳細的系統 memory 狀態。 有沒有辦法在系統正常運行的情況下查詢這些信息?
我知道可以在/proc/meminfo
找到基本信息,但我找不到的詳細信息是 OOM Killer output 中的以下幾行(來自我的系統的示例):
Node 0 DMA: 0*4kB 0*8kB 1*16kB (U) 0*32kB 2*64kB (U) 1*128kB (U) 1*256kB (U) 0*512kB 1*1024kB (U) 1*2048kB (M) 3*4096kB (M) = 15888k
B
Node 0 DMA32: 14121*4kB (UME) 18163*8kB (UME) 12588*16kB (UME) 5074*32kB (UME) 1404*64kB (UME) 484*128kB (UME) 19*256kB (UME) 0*512k
B 0*1024kB 0*2048kB 0*4096kB = 722236kB
Node 0 Normal: 399161*4kB (UME) 126769*8kB (UME) 74232*16kB (UME) 26738*32kB (UME) 5767*64kB (UME) 1079*128kB (UME) 50*256kB (UE) 2*
512kB (U) 0*1024kB 0*2048kB 0*4096kB = 5175148kB
此信息告訴系統為將來的 memory 請求准備了多少可用 RAM。 我正在嘗試最大程度地減少系統延遲,並且我想收集並記錄有關每個存儲桶中通常有多少可用空間的信息,以便在激活 OOM Killer 時更好地了解異常情況,因為系統經常出現高延遲在那之前。
在不觸發 OOM Killer 的情況下,是否可以使用 vanilla Linux kernel 訪問以上三行中的信息? (顯然,NUMA 系統可以有更多的 RAM 節點,所以上面幾行是最少的信息。)
正確的文件稱為/proc/buddyinfo
,它看起來像這樣:
$ cat /proc/buddyinfo
Node 0, zone DMA 0 0 1 0 2 1 1 0 1 1 3
Node 0, zone DMA32 52816 22757 16135 7177 2517 548 19 0 0 0 0
Node 0, zone Normal 27530 148696 45276 3778 6814 3711 222 0 0 0 0
如果 kernel 使用 32 位 kernel 運行,則帶有“zone DMA32”的行將丟失。有關詳細信息,請參閱http://andorian.blogspot.com/2014/03/making-sense-of-procbuddyinfo.html 。
這很重要的原因是,如果請求的 memory 大小大於最大的可用連續 memory 區域,則您可能會因為 memory 碎片而最終觸發 kernel OOM Killer。 關於 memory 碎片的詳細信息可以在這里找到: http://events17.linuxfoundation.org/sites/events/files/slides/%5BELC-2015%5D-System-wide-Memory-Defragmenter.pdf
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.