簡體   English   中英

如何在不觸發OOM killer的情況下查詢kernel memory池狀態?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM