【问题标题】:How to query kernel memory pool status without triggering OOM killer?如何在不触发OOM杀手的情况下查询内核内存池状态?
【发布时间】:2021-10-23 05:30:35
【问题描述】:

我知道当 OOM Killer 被触发时,内核会向内核日志发送详细的系统内存状态。有没有办法在系统正常运行时查询这些信息?

我知道基本信息可以在 /proc/meminfo 找到,但我找不到的详细信息是 OOM Killer 输出中的以下几行(来自我的系统的示例):

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

此信息表明系统为将来的内存请求准备了多少可用 RAM。我正在尝试最大程度地减少系统延迟,并且我想收集和记录有关我通常在每个存储桶中拥有多少可用空间的信息,以便我可以更好地了解激活 OOM Killer 时的异常情况,因为系统经常出现高延迟在此之前。

上面三行中的信息是否可以在不触发 OOM Killer 的情况下使用 vanilla Linux 内核访问? (显然,NUMA 系统可能有更多的 RAM 节点,所以以上几行是最少的信息。)

【问题讨论】:

    标签: linux linux-kernel system ram


    【解决方案1】:

    正确的文件名为/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 
    

    如果内核使用 32 位内核运行,带有“区域 DMA32”的行将丢失。详情请见http://andorian.blogspot.com/2014/03/making-sense-of-procbuddyinfo.html

    这很重要的原因是,如果请求的内存大小大于最大的可用连续内存区域,您最终可能会因为内存碎片而触发内核 OOM Killer。关于内存碎片的详细信息可以在这里找到:http://events17.linuxfoundation.org/sites/events/files/slides/%5BELC-2015%5D-System-wide-Memory-Defragmenter.pdf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多