我在 Debian Squeeze 上为一个繁忙的服务器使用 nginx+php-fpm,在处理达到最大连接数的问题时遇到了很大困难。这里的问题是,php 进程有时会在高负载下随机死亡,导致服务器没有 php 进程。然后我需要手动重启 php5-fpm 服务才能让服务器恢复运行。
我想知道如何避免这种情况发生,或者至少通过在没有 php 进程监听传入请求时自动重新启动 php5-fpm 来治疗症状。 我的相关配置是:
pm = dynamic
pm.max_children = 1400
pm.start_servers = 10
pm.max_spare_servers = 20
pm.process_idle_timeout = 1s; #not sure it will be useful when pm=dynamic
pm.max_requests = 100000
request_terminate_timeout = 30
我很感激您为解决这一棘手问题提出的建议。
答案1
旧的看门狗脚本想法,嗯?这不是解决问题的最优雅的方法,但它可以暂时补救这种情况,直到你能弄清楚为什么会发生这种情况。
需要解决的实际问题是,要么服务器需要进行更精细的调整,要么服务器本身就不够强大,无法处理负载。
您已确定该进程确实已终止。在这种情况下,只需确定该进程是否仍然存在即可。ps aux 应该可以帮您完成此操作。
例如:
ps aux|grep php-fpm|grep -v grep|awk '{print $2}'
应该输出php-fpm的进程id,如果不存在需要重启
因此类似这样的方法应该可以解决问题。(简短而简单)
#!/bin/bash
pid=`ps aux|grep php-fpm|grep -v grep|awk '{print $2}'`
if [ $pid == '' ]
then
service php-fpm restart
fi
该脚本将每分钟作为 crontab 运行。并且尚未调试。因此,请对其进行试验并确保其正常运行。
对僵尸进程执行此操作的问题在于它们实际上存在并且正在“运行”,但实际上并没有执行任何操作。在这种情况下,需要先终止它们,然后重新启动进程。
再次强调,正确的做法是确定导致服务崩溃的真正原因。监视脚本的理念只是为了为您争取时间。
希望有帮助。祝你好运
答案2
php-fcgi 的问题是:进程在每次请求后都会保持活动状态(与 php-cgi 不同)。每次请求都会增加 php 进程的内存使用量。任何时候进程都会达到 php 的内存限制。
您可以通过减少来避免这种情况
pm.max_requests = <value>
答案3
下午.max_children = 1400
您不会想将最大子代参数设置得那么高。这实际上太高了。
你可能想尝试一下,但是老实说:
从...开始:
下午.max_children = 50
看看进展如何。