有没有办法告诉Linux内核只对缓冲区缓存使用一定百分比的内存?我知道/proc/sys/vm/drop_caches
可以暂时清除缓存,但是是否有任何永久设置阻止它增长到超过50%的主内存?
我之所以要这样做,是因为我有一个服务器运行Ceph,它不断地从磁盘中提供数据,并设法在几个小时内将整个物理内存作为缓冲区缓存使用。同时,我需要运行将分配大量物理内存(几个10s GB)的应用程序。与流行的观点相反(请参阅有关缓冲区缓存的几乎所有问题的建议),通过丢弃干净的缓存条目来自动释放内存并不是即时的:当缓冲区缓存已满(*)时启动我的应用程序可能需要一分钟的时间,而在清除缓存(使用echo 3 > /proc/sys/vm/drop_caches
)之后,同一应用程序几乎立即启动。
(*)在启动时间的这一分钟,应用程序在新内存中出现故障,但根据名为pageblock_pfn_to_page
的函数中的Vtune,它将100%的时间花在内核上。这个函数似乎与查找巨大页面所需的内存压缩有关,这使我相信实际上碎片是问题所在。
发布于 2016-01-13 03:18:37
如果您不想要一个绝对的限制,而只是对内核施加压力,让它更快地清除缓冲区,那么您应该看看vm.vfs_cache_pressure
。
这个变量控制内核回收用于缓存VFS缓存的内存的倾向,而不是分页缓存和交换。增加此值会增加VFS缓存的回收速率。
范围从0到200。为了更高的压力,把它移到200。默认设置为100。您还可以使用slabtop
命令分析您的内存使用情况。在您的示例中,dentry
和*_inode_cache
值必须很高。
如果你想要一个绝对的限制,你应该查找cgroups
。将Ceph服务器放置在一个cgroup中,并通过为cgroup设置memory.limit_in_bytes
参数来限制它可以使用的最大内存。
memory.memsw.limit_in_bytes
设置内存和交换使用量之和的最大值。如果未指定任何单位,则将该值解释为字节。但是,可以使用后缀来表示较大的单位--k或K表示千字节,m或M表示兆字节,g或G表示G。
参考文献:
2 - RHEL 6资源管理指南
发布于 2016-01-13 00:35:24
我不知道A%,但是,你可以设定一个时间限制,这样在x分钟之后它就会掉下来。
航站楼第一名
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
清除当前缓存。
让它成为一个cron-job
按Alt-F2,键入gksudo gedit /etc/crontab
,然后在底部附近添加这一行。
*/15 * * * * root sync && echo 3 > /proc/sys/vm/drop_caches
**每15分钟清洗一次。如果您真的想要将第一个参数更改为*或/5而不是/15,则可以将其设置为1或5分钟
若要查看空闲RAM,除缓存外:
free -m | sed -n -e '3p' | grep -Po "\d+$"
发布于 2022-02-08 22:41:39
您还可以使用vm.min_free_kbytes (/proc/sys/vm/min_free_k)来防止Linux内核使用过多的内存进行缓冲(您需要尝试设置不同的值,以找出哪些值适合您的用例)。
https://unix.stackexchange.com/questions/253816
复制相似问题