【问题标题】:available memory in kernel内核中的可用内存
【发布时间】:2011-09-18 01:54:04
【问题描述】:

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

【问题讨论】:

  • 您已经非常清楚地表明内存不足(分配返回NULL),为什么还要寻找另一个?
  • 检查有多少内存可用,尤其是在内存不足的情况下,是行不通的。其他一些线程可能已经分配了您检查时间和分配时间之间剩下的任何内容。
  • 也许您正在尝试分配零字节?也检查一下。
  • 每次使用较小的块循环 kmalloc,直到获得有效指针?这是蛮力但可能有效
  • 内部碎片是内核的问题,这意味着即使有大量可用内存,大分配仍然可能因为没有足够的contiguous而失败可用内存。

标签: c memory linux-kernel


【解决方案1】:

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

也就是说,有用于查询内核内存可用性的 API。您应该注意内核有多个内存池,因此即使其中一个 API 说您没有可用 RAM,也可能是它在您感兴趣的内存池中可用。

首先,我们有si_meminfo。该调用提供/proc/meminfo 的可用性数据等,并报告伙伴页面分配器的当前状态。请注意,缓存和缓冲内存可以很快转换为空闲内存。

global_page_state(NR_SLAB_RECLAIMABLE) 也可以用来计算有多少slab内存可以被快速回收。如果您请求分配,此内存可以并且将按需释放。

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

【讨论】:

  • 如果我错了,请纠正我,但是在处理内核空间中的内存泄漏时,关于可用内核内存的非常粗略和竞争的易受攻击的信息是否有用?我的意思是检查可用内存,然后运行 ​​X 次驱动程序或分配内存的任何东西,最后检查差异有多大。
【解决方案2】:

您的可用内存有什么用途?最坏的情况是您在竞争条件下运行并检查可用内存:

  1. 您获得了可用内存。够了
  2. 多任务处理,也就是内核的调度程序,会停止您的进程并继续另一个分配大量可用内存的进程。
  3. 调度程序继续您的进程。
  4. 尽管第 1 步显示有足够的​​可用内存,但您的分配失败。

【讨论】:

  • 如果我错了请纠正我,但 AFAIK 很简单,kmalloc() 总是可以显示成功。但它们实际上并不意味着当前分配了该内存。内存页面是在任务实际访问您创建的内存时创建的。
猜你喜欢
  • 2012-01-30
  • 2023-04-08
  • 1970-01-01
  • 2010-10-14
  • 2023-03-28
  • 2014-02-15
  • 2012-04-06
  • 2016-04-05
  • 1970-01-01
相关资源
最近更新 更多