4

嵌入式系统,无交换,内核 v2.6.36,启用内存压缩。

在大量使用的情况下,所有 RAM 都被缓存在缓存中。缓存使用了大约 70M 的内存。当用户空间进程分配内存时,没问题,缓存放弃它。

但是有一个第 3 方设备驱动程序似乎试图分配一个物理 5 阶页面,并因 OOM 而失败。快速浏览一下 buddyinfo 就可以确认这一点……没有可用的第 5 个订单页面。但是一旦我删除缓存,就会有很多可用并且设备驱动程序不再OOM。

所以在我看来虚拟内存分配会触发缓存下降,但物理内存分配不会?这没有意义,因为当内存被缓存占用时,内核模块可能会OOM,并且这种行为似乎比没有缓存的磁盘访问速度慢更有害。

是否有调整参数来解决这个问题?

谢谢!

4

1 回答 1

2

所以这就是发生的事情。我仍然不知道为什么高缓存使用导致内核模块OOM。问题出在我们无法访问的第 3 方代码中,所以谁知道他们在做什么。

我想如果这是设计使然,非关键磁盘缓存可能会占用所有可用的空闲内存,并导致内核模块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。

于 2013-02-02T05:40:21.897 回答