Linux

如何僅對分叉子程序而不是父程序設置記憶體/cpu 限制?

  • April 18, 2019

有沒有辦法限制(比如說)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(在它之前呼叫setrlimitsyscall )的行為來重載動態連結的 執行檔(或者等效地,修補你自己的變體libc.so),但這是不合理的. 另請參閱file(1)ldd(1)以檢測此類動態連結的執行檔。

但是,您可以使用ulimit內置的 shell 來限制 Apache2 及其所有子級。您可能會深入研究 Apache2 文件,它有大量關於其子程序的設置。

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