我们遇到一个问题,在生产服务器上,我们系统中的一些错误锁定/挂起了一个php-fpm进程并且没有被释放,这会导致超过10-15分钟的时间来锁定更多进程(可能正在尝试访问未发布的共享资源)一段时间后服务器无法为任何新用户提供服务,因为没有可用的免费php-fpm进程。
在尝试并找到创建死锁的同时,我们考虑创建一个简单的cron作业,每1-2分钟运行一次,如果它看到X以上的最大进程,它将杀死所有php-fpm进程或重新启动php-fpm。
您如何看待问题的简单临时解决方案? 简单的PHP脚本,
$processCount = shell_exec("ps aux|grep php-fpm|grep USERNAME -c");
$killAll = $processCount >=60;
if($killAll){
echo "killing all processes";
try{
shell_exec("kill -9 $(lsof -t -i:9056)");
}catch(Exception $e1){
}
shell_exec("sudo service php56u-php-fpm restart");
$processCount = shell_exec("ps aux|grep php-fpm|grep USERNAME -c"); //check how much now
}
答案 0 :(得分:1)
杀死所有php进程似乎不是解决问题的好方法。它还会杀死合法进程并向访问者返回错误,并且通常只是更深层地隐藏问题。您还可能会不加区别地引入数据不一致,损坏的文件和其他杀死进程的问题。
也许最好设置一些超时,因此如果执行时间太长,该进程将被终止。
你可以在php-fpm pool config中添加这样的东西:
request_terminate_timeout = 3m
php.ini中的和/或max_execution_time
您还可以在php-fpm config中启用日志记录:
slowlog = /var/log/phpslow.log
request_slowlog_timeout = 2m
这将记录缓慢的请求,并可能帮助您找到问题的重点。
答案 1 :(得分:1)
它不是杀死PHP进程的好方法。在PHP-fpm配置文件(/etc/php5/pool.d/www.conf)
中设置pm.max_requests=100
,因此在100次请求后,进程将关闭,其他进程将启动另一个进程。
也许您的代码存在问题,请确保请求已结束。
因此,如果您的脚本出现问题,请尝试request_terminate_timeout=2m
提供工作进程的单个请求的超时时间 ;被杀当" max_execution_time'时,应使用此选项。 ini选项 ;由于某种原因不会停止脚本执行。值为' 0'意味着关闭'。 ;可用单位:s(秒)(默认),m(inutes),h(我们的)或d(ays) ;默认值:0 ; request_terminate_timeout = 0
请注意,如果您进行长时间轮询,可能会影响您的代码。