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