`
月影无痕
  • 浏览: 1009612 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

php-cgi进程占用cpu资源过多负载高的原因分析及解决步骤

阅读更多

服务器环境:redhat linux 5.5 , nginx ,  phpfastcgi

 

在此环境下,一般php-cgi运行是非常稳定的,但也遇到过php-cgi占用太多cpu资源而导致服务器响应过慢,我所遇到的php-cgi进程占用cpu资源过多的原因有:

 

1. 一些php的扩展与php版本兼容存在问题,实践证明 eAccelerater与某些php版本兼容存在问题,具体表现时启动php-cgi进程后,运行10多分钟,奇慢无比,但静态资源访问很快,服务器负载也很正常(说明nginx没有问题,而是php-cgi进程的问题),解决办法就是从php.ini中禁止掉eAccelerater模块,再重启php-cgi进程即可

 

2. 程序中可能存在死循环,导致服务器负载超高(使用top指令查看负载高达100+), 需要借助Linux的proc虚拟文件系统找到具体的问题程序

 

3. php程序不合理使用session , 这个发生在开源微博记事狗程序上,具体表现是有少量php-cgi进程(不超过10个)的cpu使用率达98%以上, 服务器负载在4-8之间,这个问题的解决,仍然需要借助Linux的proc文件系统找出原因。

 

4. 程序中存在过度耗时且不可能完成的操作(还是程序的问题),例如discuz x 1.5的附件下载功能: source/module/forum/forum_attachement.php中的定义

 

function getremotefile($file) {
    global $_G;
    @set_time_limit(0);
    if(!@readfile($_G['setting']['ftp']['attachurl'].'forum/'.$file)) {
        $ftp = ftpcmd('object');
        $tmpfile = @tempnam($_G['setting']['attachdir'], '');
        if($ftp->ftp_get($tmpfile, 'forum/'.$file, FTP_BINARY)) {
            @readfile($tmpfile);
            @unlink($tmpfile);
        } else {
            @unlink($tmpfile);
            return FALSE;
        }
    }
    return TRUE;
}

 

没有对传入的参数作任何初步检查,而且设置了永不超时,并且使用readfile一次读取超大文件,就可能存在以下问题:
 A. 以http方式读取远程附件过度耗时

 B. FTP无法连接时,如何及时反馈出错误?

 C. readfile是一次性读取文件加载到内存中并输出,当文件过大时,内存消耗惊人

      根据实验发现采用readfile一次性读取,内存消耗会明显增加,但是CPU的利用率会下降较多。如果采用分段读取的方式,内存消耗会稍微下降,而CPU占用却会明显上升。

 

对discuz x 1.5的这个bug较好解决方法就是后台重新正确设置远程附件参数。

 

以下是我逐步整理的故障排除步骤:

1. 得到占用cpu资源过多的php-cgi进程的pid(进程id), 使用top命令即可,如下图:

 


经过上图,我们发现,有两个php-cgi进程的cpu资源占用率过高,pid分别是10059,11570,这一般都是程序优化不够造成,如何定位问题的php程序位置?

 

2. 找出进程所使用的文件

/proc/文件系统保存在内存中,主要保存系统的状态,关键配置等等,而/proc/目录下有很多数字目录,就是进程的相关信息,如下图,我们看看进程10059正在使用哪些文件?


显然,使用了/home/tmp/sess_*文件,这明显是PHP的session文件, 我们查看这个session文件的内容为:view_time|123333312412

 

到这里,我们已经可以怀疑是由于php程序写入一个叫view_time的session项而引起, 那么剩余的事件就是检查包含view_time的所有php文件,然后修改之(比如改用COOKIE),这实话, 这个view_time并非敏感数据,仅仅记录用户最后访问时间,实在没必要使用代价巨大的session, 而应该使用cookie。

 

3. 找出有问题的程序,修改之

使用vi编辑以下shell程序(假设网站程序位于/www目录下)

 

 #!/bin/bash
 find /www/ -name "*.php" > list.txt
 
f=`cat ./list.txt`
 
for n in $f
do 
    r=`egrep 'view_time' $n`
    if [ ! "$r" = "" ] ; then
        echo $n
     fi 
done

 

运行这个shell程序,将输出包含有view_time的文件, 对记事狗微博系统,产生的问题位于modules/topic.mod.class文件中

  • 大小: 99 KB
  • 大小: 59.7 KB
分享到:
评论
1 楼 bugx 2011-01-25  
我最近碰到这个PHP-CGI高负债问题,和我以前碰到的有所区别。原因好像都不一样,已经纳闷了一个多月了。大侠,您能不能帮我一下?联系QQ 28891102

相关推荐

    linux php-cgi.exe占用cpu 100%的一次排障之旅

    使用`top`命令检查系统状态,用户发现多个PHP-CGI进程占用CPU资源极高。这表明可能存在某个或某些PHP脚本导致了CPU的过度使用。进一步使用`ls -l /proc/进程ID/fd/`命令查看进程打开的文件描述符,结果显示这些进程...

    [好文]mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据.pdf

    但这种方式也存在一些缺点,比如资源消耗较大,每个Apache工作进程都会加载整个PHP解释器,如果并发请求多,可能会造成内存占用过高。 mod_fastcgi则是另一种处理PHP请求的方式,它使用FastCGI协议与PHP解释器进行...

    Nginx 502 bad gateway和Nginx 504 Gateway Time-out错误解决方法 错误解决办法

    计算公式为:`max_children = (服务器内存 - 保留内存) / 单个php-cgi进程占用内存`。 - `request_terminate_timeout`设置PHP脚本的最大执行时间。如果设置为0,表示无限制;非0值则为超时时间,防止脚本因无限循环...

    解决Nginx + PHP(FastCGI)遇到的502 Bad Gateway错误

    这个错误可能是由于多种原因引起的,比如后端服务未运行、超时设置过短或者负载过高导致的资源耗尽。下面我们将详细探讨如何解决Nginx + PHP(FastCGI)环境中的502 Bad Gateway错误。 首先,我们需要理解Nginx与...

    php写的web服务器nanoweb

    FastCGI是一种常驻型的进程管理方式,相比于传统的CGI,它可以提高性能,减少资源消耗。 2. **轻量级**:Nanoweb设计时考虑了资源效率,它的体积小,启动快,适合于内存有限的设备或者对服务器性能要求不高的场景。...

    Apache优化全面详细教程

    - **资源节约**:有效降低服务器CPU和内存的占用率,提高整体系统的稳定性。 - **负载减轻**:减少服务器的处理负担,缩短页面加载时间,并降低对后端数据库的压力。 - **用户承载量提升**:允许更多用户同时访问...

    IIS优化为WEB服务器减负.

    操作步骤:在“IIS管理器”中,通过“应用程序池”配置最大工作进程数,并可启用CPU监视等功能进一步优化。 ### 结论 综上所述,通过对IIS6.0进行合理的配置与优化,不仅可以显著提高Web服务器的性能,还能有效...

    iProber PHP探针 0.026

    1. **CPU和内存使用状况探测**:通过iProber,你可以实时查看服务器的CPU占用率和内存使用情况。这对于监控服务器资源消耗,预防过载和性能瓶颈至关重要。了解这些数据有助于在系统负载过高时采取相应措施,如调整...

    Nginx企业级WEB服务器实战

    3. **低资源消耗**:Nginx对系统内存和CPU的占用率非常低,这对于资源有限的服务器环境尤为重要。 4. **健康检查机制**:Nginx可以自动检测后端服务器的状态,并将请求转发到健康的服务器上,确保服务的连续性和可靠...

Global site tag (gtag.js) - Google Analytics