嵌入式系统,无交换,内核v2.6.36,内存压缩已启用。
在大量使用情况下,所有RAM都绑定在缓存中。缓存使用大约70M的内存。当用户空间进程分配内存时没问题,缓存就会放弃。
但是有一个第三方设备驱动程序似乎试图分配一个物理的5阶页面,并与OOM失败。快速浏览一下buddyinfo确认了这一点......没有第5个订单页面可用。但是一旦我删除缓存,就会有足够的可用内容,设备驱动程序也不再是OOM。
所以在我看来,虚拟内存分配会触发缓存丢弃,但物理内存分配不会?这没有意义,因为当内存被高速缓存绑定时,内核模块很可能是OOM,这种行为似乎比没有缓存的慢速磁盘访问更有害。
是否有调整参数来解决这个问题?
谢谢!
答案 0 :(得分:2)
所以这就是正在发生的事情。我仍然不知道为什么高缓存使用导致内核模块到OOM。问题在于我们无法访问的第三方代码,因此谁知道他们正在做什么。
我想有人可以争辩,如果这是设计的,非关键磁盘缓存可以占用所有可用的可用内存,并导致内核模块到OOM,那么恕我直言,也许磁盘缓存应该为内核留下一些东西。
我决定改为限制缓存,因此总有一些“真正免费”的内存留给内核使用,而不依赖于缓存中的“一类免费”内存。
我找到了一个内核补丁,它将添加/ proc / sys / vm / pagecache_ratio,以便您可以设置磁盘缓存可以占用的内存量。但是由于某种原因,它从未被整合到内核中(我认为这是一个好主意,特别是如果磁盘缓存可能导致内核OOM)。但我不想因为可维护性和面向未来的原因而混淆内核补丁。如果有人只是做了一次性的交易,并且不介意补丁,这里是链接: http://lwn.net/Articles/218890/
我的解决方案是我重新编译了内核并启用了cgroups,我正在使用它来限制一组负责大量磁盘访问的进程(因此运行缓存)的内存使用量。调整配置后,似乎工作正常。我将让我的设置在周末进行压力测试,看看OOM是否仍然存在。
我想我找到了自己的答案。 / proc / sys / vm /中有VM调整参数。与此问题相关的可调节设置为:min_free_kbytes,lowmem_reserve_ratio和extfrag_threshold。