PHP-FPM进程CPU 100% 问题解决办法

  • 2016-2-19 09:48
  • PHP二次开发
  • 阅读(2560)
  • 评论(9
  • 来源:互联网
  • 摘要: 最近把系统换成了linux结果使用的php5.3中的PHP-FPM进程老占CPU 100%呀,经过反复排序终于找到了还算不错的解决办法,下面大家一起来看看。一、进程跟踪# top //找出CPU使用率高的进程PID# strace -p PID //跟踪进程 ...
    最近把系统换成了linux结果使用的php5.3中的PHP-FPM进程老占CPU 100%呀,经过反复排序终于找到了还算不错的解决办法,下面大家一起来看看。
    一、进程跟踪
    # top //找出CPU使用率高的进程PID
    # strace -p PID //跟踪进程
    # ll /proc/PID/fd //查看该进程在处理哪些文件

    将有可疑的PHP代码修改之,如:file_get_contents没有设置超时时间。

    二、内存分配

    如果进程跟踪无法找到问题所在,再从系统方面找原因,会不会有可能内存不够用?据说一个较为干净的PHP-CGI打开大概20M-30M左右的内存,决定于PHP模块开启多少。
    通过pmap指令查看PHP-CGI进程的内存使用情况
    # pmap $(pgrep php-cgi |head -1)
    按输出的结果,结合系统的内存大小,配置PHP-CGI的进程数(max_children)。

    三、监控

    最后,还可以通过监控与自动恢复的脚本保证服务的正常运转。下面是我用到的一些脚本:
    只要一个php-cgi进程占用的内存超过 %1 就把它kill掉

    #!/bin/sh
    PIDS=`ps aux|grep php-cgi|grep -v grep|awk’{if($4>=1)print $2}’`
    for PID in $PIDS
    do
    echo `date +%F….%T`>>/data/logs/phpkill.log
    echo $PID >> /data/logs/phpkill.log
    kill -9 $PID
    done


    检测php-fpm进程

    #!/bin/bash
    netstat -tnlp | grep “php-cgi” >> /dev/null #2&> /data/logs/php_fasle.log
    if [ "$?" -eq "1" ];then #&& [ `netstat -tnlp | grep 9000 | awk '{ print $4}' | awk -F ":" '{print $2}'` -eq "1" ];then
    /usr/local/webserver/php/sbin/php-fpm start
    echo `date +%F….%T` “System memory OOM.Kill php-cgi. php-fpm service start. ” >> /data/logs/php_monitor.log
    fi


    通过http检测php执行

    #!/bin/bash
    status=`curl -s –head “http://127.0.0.1:8080/chk.php” | awk ‘/HTTP/ {print $2}’`
    if [ $status != "200" -a $status != "304" ]; then
    /usr/local/webserver/php/sbin/php-fpm restart
    echo `date +%F….%T` “php-fpm service restart” >> /data/logs/php_monitor.log
    fi


    解决方法二

    如果你常用上面复杂我们可以按下步骤来监控与重启PHP-FPM来解决此问题

    PHP-FPM启动脚本/etc/init.d/php-fpm
    从PHP 5.3.3开始就已经集成了PHP-FPM所以php-fpm在PHP 5.3.2以后的版本不支持以前的php-fpm (start|restart|stop|reload) 了,不用专门再打补丁了,只需要解开源码直接configure,关于php-fpm的编译参数有

    --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-libevent-dir=libevent

    位置
    进入到php源代码目录下,然后:

    cp -f (php -5.3.x-source-dir)/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

    #! /bin/sh
     
    ### BEGIN INIT INFO
    # Provides:          php-fpm
    # Required-Start:    $remote_fs $network
    # Required-Stop:     $remote_fs $network
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: starts php-fpm
    # Description:       starts the PHP FastCGI Process Manager daemon
    ### END INIT INFO
     
    prefix=/usr/local/php
    exec_prefix=${prefix}
     
    php_fpm_BIN=${exec_prefix}/sbin/php-fpm
    php_fpm_CONF=${prefix}/etc/php-fpm.conf
    php_fpm_PID=${prefix}/var/run/php-fpm.pid
     
    php_opts="--fpm-config $php_fpm_CONF"
     
    wait_for_pid () {
        try=0
     
        while test $try -lt 35 ; do
     
            case "$1" in
                'created')
                if [ -f "$2" ] ; then
                    try=''
                    break
                fi
                ;;
     
                'removed')
                if [ ! -f "$2" ] ; then
                    try=''
                    break
                fi
                ;;
            esac
     
            echo -n .
            try=`expr $try + 1`
            sleep 1
     
        done
     
    }
     
    case "$1" in
        start)
            echo -n "Starting php-fpm "
     
            $php_fpm_BIN $php_opts
     
            if [ "$?" != 0 ] ; then
                echo " failed"
                exit 1
            fi
     
            wait_for_pid created $php_fpm_PID
     
            if [ -n "$try" ] ; then
                echo " failed"
                exit 1
            else
                echo " done"
            fi
        ;;
     
        stop)
            echo -n "Gracefully shutting down php-fpm "
     
            if [ ! -r $php_fpm_PID ] ; then
                echo "warning, no pid file found - php-fpm is not running ?"
                exit 1
            fi
     
            kill -QUIT `cat $php_fpm_PID`
     
            wait_for_pid removed $php_fpm_PID
     
            if [ -n "$try" ] ; then
                echo " failed. Use force-quit"
                exit 1
            else
                echo " done"
            fi
        ;;
     
        force-quit)
            echo -n "Terminating php-fpm "
     
            if [ ! -r $php_fpm_PID ] ; then
                echo "warning, no pid file found - php-fpm is not running ?"
                exit 1
            fi
     
            kill -TERM `cat $php_fpm_PID`
     
            wait_for_pid removed $php_fpm_PID
     
            if [ -n "$try" ] ; then
                echo " failed"
                exit 1
            else
                echo " done"
            fi
        ;;
     
        restart)
            $0 stop
            $0 start
        ;;
     
        reload)
     
            echo -n "Reload service php-fpm "
     
            if [ ! -r $php_fpm_PID ] ; then
                echo "warning, no pid file found - php-fpm is not running ?"
                exit 1
            fi
     
            kill -USR2 `cat $php_fpm_PID`
     
            echo " done"
        ;;
     
        *)
            echo "Usage: $0 {start|stop|force-quit|restart|reload}"
            exit 1
        ;;
     
    esac
    

    编辑好后保存,执行以下命令

    chmod +x /etc/init.d/php-fpm
    chkconfig php-fpm on
    # 检查一下
    chkconfig --list php-fpm
    php-fpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off

    完成!可以使用以下命令管理php-fpm了

    service php-fpm start
    service php-fpm stop
    service php-fpm restart
    service php-fpm reload
     
    /etc/init.d/php-fpm start
    /etc/init.d/php-fpm stop
    /etc/init.d/php-fpm restart
    /etc/init.d/php-fpm reload

    运行service php-fpm start提示出错,怎么都没找到问题所在,后来才知道要把php-fpm.conf里的PID路径前的:分号删掉!


    PHP技术交流QQ群:422137578

    除非注明,文章均为 PHP二次开发 原创,转载请注明本文地址:http://www.php2.cc/article-2127-1.html

    相关阅读

    发表评论

    最新评论

    引用 夏日博客   2016-2-21 16:17
    这就是占用的资源太多了。
    引用 PHP二次开发   2016-2-20 21:51
    海滨博客: 我博客重新备案了,也放到了阿里,你网址现在很好看
    恩恩,其实就是备案麻烦,每次换服务器都要考虑空间商是否需要转接入。你是说现在的模板吧?谢谢哦!
    引用 PHP二次开发   2016-2-20 21:49
    vultr: 你这个评论验证码不错,是什么插件?
    discuz自带的哦。
    引用 vultr   2016-2-19 21:46
    你这个评论验证码不错,是什么插件?
    引用 vultr   2016-2-19 21:45
    尤其是在使用VPS的时候,被一些蜘蛛爬虫以及软件扫描会导致CPU超标。
    引用 跨境电商之家   2016-2-19 20:50
    很好,谢谢分享。:)
    引用 海滨博客   2016-2-19 18:02
    我博客重新备案了,也放到了阿里,你网址现在很好看
    引用 工业铝型材   2016-2-19 17:45
    不错。非常棒 很给力
    引用 192.168.1.1   2016-2-19 15:23
    用阿里云的服务器经常出现 fpm 进程占满,后来直接设置了回收才勉强解决。

    查看全部评论(9)

    用户名:  *

    邮 箱:  *

    网 址: 注意加上“http://”哦!