Apache-2.2

什麼可能導致深度嵌套的 apache prefork 子級?

  • January 15, 2014

我在 CentOS(主要是 6.4)上執行帶有 prefork 和 mod_perl 的 apache 2.2.25。最近有一個例子特別混亂,分叉了孩子的孩子:

<snip>
\_ /usr/sbin/httpd
|   \_ /usr/sbin/httpd
|   |   \_ /usr/sbin/httpd
|   |       \_ /usr/sbin/httpd
|   |           \_ /usr/sbin/httpd
|   |           |   \_ /usr/sbin/httpd
|   |           |       \_ /usr/sbin/httpd
|   |           |       |   \_ /usr/sbin/httpd
|   |           |       \_ /usr/sbin/httpd
|   |           \_ /usr/sbin/httpd
|   \_ /usr/sbin/httpd
|       \_ /usr/sbin/httpd
|       |   \_ /usr/sbin/httpd
|       |   |   \_ /usr/sbin/httpd
|       |   |   |   \_ /usr/sbin/httpd
|       |   |   \_ /usr/sbin/httpd
|       |   \_ /usr/sbin/httpd
|       \_ /usr/sbin/httpd
\_ /usr/sbin/httpd
|   \_ /usr/sbin/httpd
\_ /usr/sbin/httpd
\_ /usr/sbin/httpd
</snip>

同時,盒子記憶體不足(我不確定哪個先出現,深分叉或記憶體耗盡)。

我以前從未見過 apache 這樣做,也沒有縮小原因。我正在調查的兩種可能性是 mod_perl 中的記憶體洩漏(或者更確切地說是在我們的程式碼中,由於 mod_perl 而持續存在)或允許一些有限的分叉炸彈的安全漏洞(不能分叉任意子,但可以分叉額外阿帕奇兒童)。

我不確定是什麼導致 apache 像這樣分叉(編輯我最初提到了一個關於優雅工作方式的錯誤信念)但我的想法是循環引用類型記憶體洩漏(直接或間接通過使用所有可用記憶體在盒子上)導致某種 mod_perl 混淆,導致額外的工作者子代從子代而不是主要父代中分叉。我沒有真正的理由,只是試圖調和這兩個問題(深度分叉和記憶體使用)。

或者,我們可能有一個我需要追踪的安全漏洞。

以前有沒有人從 apache 看到過這種行為並知道解決方案?

事實證明這是在 mod_perl 下的程式碼分叉(這已經是一個壞主意),然後通過不清理孩子而使情況變得更糟。在 mod_perl 下,當你分叉時,你不是在分叉你的程式碼,你是在分叉 apache。因此,該孩子繼續像任何其他分叉的 apache 孩子一樣繼續提供內容,但不包含在計數中,因此如果您獲得太多實例,則永遠不會被剔除。

引用自:https://serverfault.com/questions/567041