限制命令使用的 inode 記憶體
我想執行一個對它們將間接觸發的核心對象進行限制的任務。請注意,這與應用程序使用的記憶體、執行緒等無關,而是與核心使用的記憶體有關。具體來說,我想限制任務可以使用的inode 記憶體數量。
我的激勵例子是
updatedb
。它可以使用大量的 inode 記憶體,用於之後大部分不需要的東西。具體來說,我想限制ext4_inode_cache
./proc/slabinfo
(請注意,這不包括在“buffers”或“cache”行中free
:這只是文件內容記憶體,slab 內容是核心記憶體並記錄在“used”列中。)
echo 2 >/proc/sys/vm/drop_caches
之後釋放記憶體,但這對我沒有任何好處:無用的東西已經取代了我想保留在記憶體中的東西,例如正在執行的應用程序及其經常使用的文件。該系統是具有最新(≥ 3.8)核心的 Linux。我可以使用 root 訪問權限進行設置。
如何在受限環境(容器?)中執行命令,以使該環境對(ext4)inode 記憶體的貢獻限制為我設置的值?
根據我自己關於LKML的問題,可以使用Control Group v2存檔:
先決條件
- 確保您的 Linux 核心已
MEMCG_KMEM
啟用,例如grep CONFIG_MEMCG_KMEM "/boot/config-$(uname -r)"
- 根據作業系統(和
systemd
版本),通過在 Linux 核心命令行上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
- 配置軟限制,例如 2 MiB:
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部分目前沒有對核心記憶體實施軟限制。當達到這些限制時,觸發板坯回收是未來的工作。