如何僅對分叉子程序而不是父程序設置記憶體/cpu 限制?
有沒有辦法限制(比如說)apache2,限制每個分叉的子工作程序使用最大 X 記憶體,而不是整個程序樹(apache2 及其所有分叉的子程序)到最大 X 記憶體?
我已經嘗試過使用 cgroups/systemd 的解決方案,但一切都限制了主程序及其所有子程序的組合,而不是每個子程序。
我正在尋找一種解決方案,不僅適用於 apache2,而且適用於所有產生子程序的程序。
只需改進您的應用程序的原始碼(在您的情況下可能是 Apache2,它是開源的)以在成功呼叫fork(2)之後但在呼叫execve(2)之前呼叫setrlimit( 2) 。
因為您真的希望在之後完成
setrlimit
系統呼叫(然後您設置的內容仍然存在,直到進一步呼叫,可能是通過您的 shell 的內置函式)。fork``setrlimit``ulimit
花一些時間來更好地理解 Linux系統呼叫(2)是如何工作的(特別是
fork
&execve
&setrlimit
)以及你應該如何以及何時使用它們。我推薦閱讀一本好的 Linux 系統程式書籍,例如ALP。因此,您想要達到的目標通常是不現實的,除非您接受對您正在使用的每個程序進行輕微更改。啟發 , 設計的Unix哲學禁止這樣 做。
fork``execve``setrlimit
當然,原則上你可以做一些瘋狂的
LD_PRELOAD
技巧fork
來重載(setrlimit
在它返回 0 之後呼叫)或execve
(在它之前呼叫setrlimit
syscall )的行為來重載動態連結的 執行檔(或者等效地,修補你自己的變體libc.so
),但這是不合理的. 另請參閱file(1)或ldd(1)以檢測此類動態連結的執行檔。但是,您可以使用
ulimit
內置的 shell 來限制 Apache2 及其所有子級。您可能會深入研究 Apache2 文件,它有大量關於其子程序的設置。