分配方式说明

分配方式说明

我的系统报告了“页面分配失败”:

[some_app]: page allocation failure: order:4, mode:0x2040d0

有人可以解释一下该模式到底代表什么吗?我说得对吗,这是针对以下 GFP 标志的:GFP_NOTRACK | GFP_COMP | GFP_WAIT | GFP_IO | GFP_FS

内核版本是3.10.0-693.21.1.el7.AV1.x86_64.

答案1

这些标志似乎是在 file 中定义的<kernel source directory>/include/linux/gfp.h,至少在内核 4.9.105 上,模式 0x2040d0 似乎映射到:

GFP_NOTRACK | GFP_COMP | GFP_FS | GFP_IO | GFP_RECLAIMABLE

但是,如果我 Google 查找标志定义,我会在某些源中看到值 0x10 定义为 GFP_WAIT 而不是 GFP_RECLAIMABLE,这似乎与您的源匹配。

这次 LWN 讨论可能是有用的阅读,但我能看到的最好的描述是在文件的注释中include/linux/gfp.h

一般来说,这些模式标志会修改页面分配器的工作。

  • GFP_NOTRACK:避免使用kmemcheck.
  • GFP_COMP:地址复合页元数据
  • GFP_FS:表示分配器可以在必要时调用低级文件系统来回收页面;如果清除此选项,我认为这表明分配是针对某些可能持有锁的文件系统代码...例如,这在使用交换文件时可能很重要。
  • GFP_IO:表示分配器可以启动物理I/O来回收页面以满足此请求。
  • GFP_RECLAIMABLE:“[此]用于指定 SLAB_RECLAIM_ACCOUNT 的slab分配,并且其页面可以通过收缩器释放。”该标志显然是由文件系统的内存分配使用的。基本上,这似乎意味着有一个内核函数(收缩器)可以在必要时调用来释放或最小化此分配。

相关内容