Linux

如何限制程序及其子程序的總資源(記憶體)

  • September 6, 2021

關於限制單個程序的資源有很多問題和答案,例如 RLIMIT_AS 可用於限制程序分配的最大記憶體,可以看作是 VIRT 之類的top。有關該主題的更多資訊,例如這裡有沒有辦法限制特定程序在 Unix 中可以使用的記憶體量?

setrlimit(2)文件說:

通過 fork(2) 創建的子程序繼承其父程序的資源限制。資源限制在 execve(2) 中保留。

應該這樣理解:

如果一個程序的 RLIMIT_AS 為 2GB,那麼它不能分配超過 2GB 的記憶體。當它產生一個子程序時,2GB 的地址空間限制將傳遞給子程序,但計數從 0 開始。2 個程序加起來最多可以佔用 4GB 記憶體。

但是,限制整個程序樹分配的記憶體總和的有用方法是什麼?

我不確定這是否能回答您的問題,但我發現這個perl 腳本聲稱完全符合您的要求。該腳本實現了自己的系統,通過喚醒和檢查程序及其子程序的資源使用情況來強制執行限制。它似乎有很好的記錄和解釋,並且最近已更新。

正如 slm 在他的評論中所說,cgroups 也可以用於此。您可能必須安裝用於管理 cgroup 的實用程序,假設您在 Linux 上,您應該查找libcgroups.

sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup

確保$USER是您的使用者。

然後,您的使用者應該可以訪問 .cgroup 中的記憶體設置/sys/fs/cgroup/memory/myGroup

然後,您可以通過執行以下操作將限制設置為 500 MB:

echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes

現在讓我們執行 Vim:

cgexec -g memory:myGroup vim

vim 程序及其所有子程序現在應該被限制為使用 500 MB 的 RAM。但是,我認為這個限制只適用於 RAM 而不是交換。一旦程序達到限制,它們將開始交換。我不確定你是否可以解決這個問題,我找不到使用 cgroups 限制交換使用的方法。

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