(转)限制Linux中 buffer/cache (缓冲区缓存)的大小

限制Linux中缓冲区缓存的大小

有没有办法告诉Linux内核只使用一定比例的内存用于缓冲区缓存?我知道/proc/sys/vm/drop_caches可用于临时清除缓存,但是有任何永久设置可以防止它增长到超过例如50%的主存?

我想要这样做的原因是,我有一台运行Ceph OSD的服务器,它不断地从磁盘提供数据,并设法在几个小时内将整个物理内存用作缓冲区缓存。
同时,我需要运行将分配大量(几十GB)物理内存的应用程序。
与流行的看法相反(参见几乎所有关于缓冲区缓存的问题的建议),通过丢弃干净的缓存条目来自动释放内存并不瞬间:

启动我的应用程序可能需要一分钟当缓冲区缓存已满(*)时,
而清除缓存后(使用echo 3 > /proc/sys/vm/drop_caches),相同的应用程序几乎立即启动。

(*)根据Vtune在一个名为pageblock_pfn_to_page的函数中,在启动时间的这一分钟内,应用程序会出现新的内存错误但在内核中花费100%的时间。这个函数似乎与查找大页面所需的内存压缩有关,这让我相信实际上碎片是问题所在。

作者:Wim
最佳答案

如果您不想要绝对限制但只是迫使内核更快地清除缓冲区,那么您应该查看vm.vfs_cache_pressure

此变量控制内核回收用于缓存VFS缓存的内存的趋势,而不是pagecache和swap。增加此值会增加回收VFS缓存的速率。

范围从0到200.将其移向200以获得更高的压力。默认值设置为100.您还可以使用slabtop命令分析内存使用情况。在您的情况下,dentry和*_inode_cache值必须很高。

如果你想要一个绝对限制,你应该查找cgroups。将Ceph OSD服务器放在cgroup中,并通过为cgroup设置memory.limit_in_bytes参数来限制它可以使用的最大内存。

memory.memsw.limit_in_bytes设置内存和交换使用总和的最大金额。如果未指定单位,则将该值解释为字节。但是,可以使用后缀来表示更大的单位 – k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。

参考文献:

[1] – GlusterFS Linux内核调优

[2] – RHEL 6资源管理指南

作者:NOLFXceptMe