Gil*_*il' 7 linux memory cache inode limit
我想运行一个对它们将间接触发的内核对象有限制的任务。请注意,这与应用程序使用的内存、线程等无关,而是与内核使用的内存有关。具体来说,我想限制任务可以使用的inode 缓存量。
我的激励示例是updatedb
. 它可以使用大量的 inode 缓存,用于之后大部分不需要的东西。具体来说,我要限制由指定的值ext4_inode_cache
一致/proc/slabinfo
。(请注意,这不包括在 显示的“缓冲区”或“缓存”行中free
:这只是文件内容缓存,slab 内容是内核内存并记录在“已使用”列中。)
echo 2 >/proc/sys/vm/drop_caches
之后释放缓存,但这对我没有任何好处:无用的东西已经取代了我想保留在内存中的东西,例如运行的应用程序及其常用文件。
该系统是具有最新 (? 3.8) 内核的 Linux。我可以使用 root 访问权限进行设置。
如何在有限的环境(容器?)中运行命令,以便该环境对(ext4)inode 缓存的贡献仅限于我设置的值?
根据我自己关于LKML 的问题,可以使用Control Group v2进行存档:
MEMCG_KMEM
启用,例如grep CONFIG_MEMCG_KMEM "/boot/config-$(uname -r)"
systemd
启用,例如通过.cgroups2
systemd.unified_cgroup_hierarchy=1
/boot/grub/grub.cfg
cgroup2
文件系统安装在/sys/fs/cgroup/
例如mount -t cgroup2 none /sys/fs/cgroup
或等效文件系统上/etc/fstab
。(systemd
默认情况下会自动为您执行此操作)my-find
(每次启动一次):mkdir /sys/fs/cgroup/my-find
echo $$ >/sys/fs/cgroup/my-find/cgroup.procs
echo 2M >/sys/fs/cgroup/my-find/memory.high
找到正确的值需要调整和试验。memory.current
您可以从和/或获取当前值memory.stat
。随着时间的推移,您应该会看到high
增加memory.events
,因为 Linux 内核现在反复强制缩小缓存。
请注意,该限制同时适用于用户空间内存和内核内存。它还适用于该组的所有进程,其中包括由 启动的子进程updatedb
,它基本上执行find | sort | frcode
,其中:
find
是程序破坏了dentry
和inode
缓存,这是我们想要限制的。否则它的用户空间内存需求(理论上)是恒定的。sort
需要大量内存,否则它将回退到使用临时文件,这将导致额外的 IO。frcode
将结果写入磁盘 - 例如单个文件 - 这需要恒定的内存。所以基本上你应该只放入find
一个单独的cgroup
以限制其缓存垃圾,但不应该sort
放入 和frcode
。
它不起作用,cgroup v1
因为设置memory.kmem.limit_in_bytes
已被弃用,并且一旦进程超过配置的限制,就会导致“内存不足”事件,这会立即终止您的进程,而不是强制 Linux 内核缩小内存使用量通过删除旧数据。引用CONFIG_MEMCG_KMEM部分
目前内核内存没有实现软限制。未来的工作是在达到这些限制时触发板回收。