embedded式系统,无交换,内核v2.6.36,启用内存压缩。
在大量使用的情况下,所有的RAM都被绑定在caching中。 高速caching使用了大约70M的内存。 当用户空间进程分配内存时,没有问题,caching就放弃了。
但有一个第三方设备驱动程序似乎尝试分配一个物理5阶页面,并与OOM失败。 快速浏览buddyinfo确认这一点…没有第五订单页面可用。 但是,一旦我放弃caching,大量可用和设备驱动程序不再OOM。
所以在我看来,虚拟内存分配将触发caching下降,但物理内存分配不会? 这是没有道理的,因为当内存被绑定在caching中时,内核模块可能会出现OOM,而这种行为似乎比没有caching的慢速磁盘访问更为有害。
有没有一个调整参数来解决这个问题?
谢谢!
所以这是怎么回事 我仍然不知道为什么高速缓存使用导致内核模块到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