【问题标题】:Monitor php-fpm max processes count script监控 php-fpm max processes count 脚本
【发布时间】:2018-02-05 08:20:58
【问题描述】:

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

【问题讨论】:

  • 更新你的PHP版本到PHP7,fpm比5.6好很多。他们支持 PHPNG 的速度非常快。
  • 为什么在 PHP 中这样做?您可能应该解决实际问题,而不是放置一些随机重新启动服务的东西。或者将站点迁移到工作就绪的生产服务器。

标签: php


【解决方案1】:

杀死所有 php 进程似乎不是解决问题的好方法。它还会杀死合法进程并将错误返回给访问者,并且通常只是更深地隐藏问题。您还可能会引入数据不一致、文件损坏和其他不加选择地杀死进程的问题。

也许最好设置一些超时时间,这样如果执行时间过长,进程就会被杀死。

您可以在 php-fpm 池配置中添加类似的内容:

request_terminate_timeout = 3m

和/或 php.ini 中的 max_execution_time


您还可以在 php-fpm 配置中启用日志记录:

slowlog = /var/log/phpslow.log
request_slowlog_timeout = 2m

这将记录缓慢的请求,并可能帮助您找到问题的罪魁祸首。

【讨论】:

    【解决方案2】:

    杀死 PHP 进程并不是一个好的解决方案。在您的 PHP-fpm 配置文件中 (/etc/php5/pool.d/www.conf)

    设置pm.max_requests=100,这样在100个请求后进程将关闭,其余的请求将启动另一个进程。

    您的代码也可能有问题,请确保请求已结束。

    因此,如果您的脚本有问题,请尝试request_terminate_timeout=2m

    处理单个请求的超时时间,之后工作进程将 ;被杀。当 'max_execution_time' ini 选项时应使用此选项 ;由于某种原因不会停止脚本执行。值“0”表示“关闭”。 ;可用单位:s(econds)(默认)、m(inutes)、h(ours) 或 d(ays) ;默认值:0 ;request_terminate_timeout = 0

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

    【讨论】:

    • 如果 CRM 中有一个特定进程应该允许运行 30 分钟,但其余的都不应该运行,那么配置中有没有办法允许这样做?
    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多