是否有内核函数返回可用内核内存量(与vmalloc无关)。
答案 0 :(得分:12)
首先,请允许我说,如果您要根据此信息做出任何政策决定(我应该继续执行此操作吗?),停止。正如WGW指出的那样,这里有不可避免的种族;在您检查和使用它之间可以使用内存。只测试内存分配错误并获得适当的故障路径。此外,如果在没有足够的可用内存时请求内存,内核通常可以通过清理各种缓存,交换到磁盘,释放slab等来获得更多可用内存。内核内存碎片可能会失败(多页)即使没有足够的内存,也不能通过vmalloc进行分配。
也就是说,有用于查询内核内存可用性的API。你应该注意到内核有多个内存池,所以即使其中一个API说你没有空闲内存,也可能是你感兴趣的内存池中可用的。
首先,我们有si_meminfo。这是为/proc/meminfo
提供可用性数据的调用,以及有关伙伴页面分配器当前状态的报告。请注意,缓存和缓冲区ram可以很快转换为free ram。
global_page_state(NR_SLAB_RECLAIMABLE)
也可用于计算可以快速回收多少板坯内存的计数。如果您请求分配,则可以并且将按需释放此内存。
SLUB分配器(用于kalloc()
等等)还提供其内部内存池的统计信息,这些内存池也可以反映每个内存池中的可用内存。这可能不适用于相同的API,具体取决于您的配置中选择了哪个分配器 - 请除调试外不要使用此数据。相关代码(实施/proc/slabinfo
)可在mm/slub.c
答案 1 :(得分:3)
可用内存有哪些用途?最糟糕的情况是你在竞争条件下运行并检查可用内存: