Linux

限制命令使用的 inode 記憶體

  • July 7, 2021

我想執行一個對它們將間接觸發的核心對象進行限制的任務。請注意,這與應用程序使用的記憶體、執行緒等無關,而是與核心使用的記憶體有關。具體來說,我想限制任務可以使用的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存檔:

先決條件

  1. 確保您的 Linux 核心已MEMCG_KMEM啟用,例如grep CONFIG_MEMCG_KMEM "/boot/config-$(uname -r)"
  2. 根據作業系統(和systemd版本),通過在 Linux 核心命令行上cgroups2指定來啟用使用,例如通過.systemd.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的來限制它的記憶體垃圾,而不是sortfrcode.

寫完之後

它不起作用,cgroup v1因為設置memory.kmem.limit_in_bytes已被棄用,並且一旦程序超過配置的限制就會導致“記憶體不足”事件,這會立即終止您的程序,而不是強制 Linux 核心縮減記憶體使用量通過刪除舊數據。引用CONFIG_MEMCG_KMEM部分

目前沒有對核心記憶體實施軟限制。當達到這些限制時,觸發板坯回收是未來的工作。

引用自:https://unix.stackexchange.com/questions/202586