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启用,例如通过.cgroups2systemd.unified_cgroup_hierarchy=1/boot/grub/grub.cfgcgroup2文件系统安装在/sys/fs/cgroup/例如mount -t cgroup2 none /sys/fs/cgroup或等效文件系统上/etc/fstab。(systemd默认情况下会自动为您执行此操作)my-find(每次启动一次):mkdir /sys/fs/cgroup/my-findecho $$ >/sys/fs/cgroup/my-find/cgroup.procsecho 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部分
目前内核内存没有实现软限制。未来的工作是在达到这些限制时触发板回收。
| 归档时间: |
|
| 查看次数: |
2451 次 |
| 最近记录: |