内核中的可用内存

kum*_*mar 3 c memory linux-kernel

是否有内核函数返回可用的内核内存量(与vmalloc无关).

bdo*_*lan 12

首先,请允许我说,如果您要根据此信息做出任何政策决定(我应该继续执行此操作吗?),请停止.正如WGW指出的那样,这里有不可避免的种族; 在您检查和使用它之间可以使用内存.只测试内存分配错误并获得适当的故障路径.此外,如果在没有足够的可用内存时请求内存,通常内核可以通过清理各种缓存,交换到磁盘,释放slab等来获得更多可用内存.内核内存碎片可能会失败(多页)即使有足够的内存空间,也不通过vmalloc进行分配.

也就是说,有用于查询内核内存可用性的API.你应该注意到内核有多个内存池,所以即使其中一个API说你没有空闲的RAM,也可能是你感兴趣的内存池中可用的内存池.

首先,我们有si_meminfo.这是为其提供可用性数据的调用/proc/meminfo,以及有关伙伴页面分配器当前状态的报告.请注意,缓存和缓冲区ram可以非常快速地转换为free ram.

global_page_state(NR_SLAB_RECLAIMABLE)也可以用来计算可以快速回收多少板坯内存的数量.如果您请求分配,则可以并且将按需释放此内存.

SLUB分配器(用于kalloc()等等)还为其内部内存池提供统计信息,这些内存池也可以反映每个内存池中的空闲内存.根据您的配置中选择的分配器,可能无法使用相同的API - 除了调试之外,不要使用此数据.相关代码(实现/proc/slabinfo)可以在mm/slub.c中找到