各种 Perl 脚本(服务器端包含)正在调用网站上具有许多功能的 Perl 模块。 编辑: 脚本使用use lib从文件夹中引用库。在繁忙时期,脚本(而不是库)会变成僵尸并使服务器超载。
服务器列出:
319 ? Z 0:00 [scriptname1.pl] <defunct>
320 ? Z 0:00 [scriptname2.pl] <defunct>
321 ? Z 0:00 [scriptname3.pl] <defunct>
我有数百个实例。
编辑: 我们没有使用 fork、system 或 exec,除了 SSI 指令
<!--#exec cgi="/cgi-bin/scriptname.pl"-->
据我所知,在这种情况下 httpd 本身将是该进程的所有者。MaxRequestPerChild 设置为 0,这不应该让父进程在子进程完成之前死亡。
到目前为止,我们认为暂时挂起一些脚本有助于服务器处理已失效的进程并防止其崩溃,但毫无疑问,僵尸进程仍在形成。显然gbacon似乎与他的理论最接近事实,即服务器无法应对负载。
什么可能导致 httpd 放弃这些进程?是否有任何最佳实践来防止这些情况发生?
谢谢
答案: 重点是 Rob。正如他所说,生成 SSI 的 CGI 脚本不会处理这些 SSI。SSI 的评估发生在 Apache 1.3 请求周期中 CGI 的运行之前。Apache 2.0 及更高版本已修复此问题,以便 CGI 可以生成 SSI 命令。
由于我们在 Apache 1.3 上运行,因此对于每个页面视图,SSI 都会变成无效进程。尽管服务器试图清除它们,但由于运行任务太忙而无法成功。结果,服务器翻倒并没有响应。作为一个短期解决方案,我们审查了所有 SSI 并将一些进程移至客户端以释放服务器资源并给它时间进行清理。后来我们升级到 Apache 2.2。