监视php-fpm max进程计数脚本

时间:2018-02-05 08:20:59

标签: php

我们遇到一个问题,在生产服务器上,我们系统中的一些错误锁定/挂起了一个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
}

2 个答案:

答案 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

请注意,如果您进行长时间轮询,可能会影响您的代码。