我使用prefork和mod_perl在CentOS(主要是6.4)上运行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而持续存在)中的内存泄漏,或者是允许一些有限的fork炸弹的安全漏洞(不能分离任意儿童,但可以分离额外的阿帕奇儿童)。
我不知道是什么会导致apache像这样叉( 编辑我最初提到一个错误的信念是多么优雅的工作),但我的想法是,一个循环引用types内存泄漏(直接或间接通过使用所有可用的内存在盒子上)造成某种mod_perl混淆,导致额外的工人子女,而不是主要的父母。 我没有真正的理由,只是试图调和这两个问题(深层分叉和内存使用)。
另外,我们可能有一个安全漏洞,我需要追查。
有没有人从apache之前看过这种行为,并知道一个解决scheme?
事实certificate,这是mod_perl下的代码分支(这已经是一个坏主意),然后通过不清理孩子而变得更糟。 在mod_perl下,当你分叉的时候,你不是分叉你的代码,而是分叉Apache。 那么这个孩子继续像其他任何派生的apache孩子一样继续提供内容,但是不会被包括在计数中,因此如果你得到太多的实例,将不会被剔除。