限制命令使用的 inode 缓存

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 缓存的贡献仅限于我设置的值?

pmh*_*ahn 3

根据我自己关于LKML 的问题,可以使用Control Group v2进行存档:

先决条件

  1. 确保您的 Linux 内核已MEMCG_KMEM启用,例如grep CONFIG_MEMCG_KMEM "/boot/config-$(uname -r)"
  2. 根据操作系统(和版本),可以通过在 Linux 内核命令行上指定来systemd启用,例如通过.cgroups2systemd.unified_cgroup_hierarchy=1/boot/grub/grub.cfg
  3. 确保cgroup2文件系统安装在/sys/fs/cgroup/例如mount -t cgroup2 none /sys/fs/cgroup或等效文件系统上/etc/fstab。(systemd默认情况下会自动为您执行此操作)

祈求

  1. 为您的进程创建一个新组my-find(每次启动一次):mkdir /sys/fs/cgroup/my-find
  2. 将(当前)进程(及其所有未来的子进程)附加到该组:echo $$ >/sys/fs/cgroup/my-find/cgroup.procs
  3. 配置软限制,例如 2 MiB:echo 2M >/sys/fs/cgroup/my-find/memory.high

找到正确的值需要调整和试验。memory.current您可以从和/或获取当前值memory.stat。随着时间的推移,您应该会看到high增加memory.events,因为 Linux 内核现在反复强制缩小缓存。

附录

请注意,该限制同时适用于用户空间内存和内核内存。它还适用于该组的所有进程,其中包括由 启动的子进程updatedb,它基本上执行find | sort | frcode,其中:

  • find是程序破坏了dentryinode缓存,这是我们想要限制的。否则它的用户空间内存需求(理论上)是恒定的。
  • sort需要大量内存,否则它将回退到使用临时文件,这将导致额外的 IO。
  • frcode将结果写入磁盘 - 例如单个文件 - 这需要恒定的内存。

所以基本上你应该只放入find一个单独的cgroup以限制其缓存垃圾,但不应该sort放入 和frcode

后经文

它不起作用,cgroup v1因为设置memory.kmem.limit_in_bytes已被弃用,并且一旦进程超过配置的限制,就会导致“内存不足”事件,这会立即终止您的进程,而不是强制 Linux 内核缩小内存使用量通过删除旧数据。引用CONFIG_MEMCG_KMEM部分

目前内核内存没有实现软限制。未来的工作是在达到这些限制时触发板回收。