`
月影无痕
  • 浏览: 1008914 次
  • 性别: 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

相关推荐

    服务器大量php-cgi.exe进程,导致CPU占用100%的解决[定义].pdf

    进程导致CPU占用100%的问题分析及解决方案 #### 一、问题背景 在IT运维领域中,服务器资源管理尤其是CPU利用率的监控至关重要。当出现服务器上的`php-cgi.exe`进程占用大量CPU资源的情况时,可能会导致整个系统的...

    php-cgi为何占用CPU100%.pdf

    "PHP-CGI占用CPU100%的原因分析" 在实际工作中,经常会遇到PHP-CGI占用CPU100%的情况,这种情况会导致服务器的性能下降,影响到网站的正常运行。那么,PHP-CGI为什么会占用CPU100%呢? 首先,我们需要了解PHP-CGI...

    nginx+php-cgi 进程守护工具

    php_cgi_start => 填写 php-cgi 启动参数及端口 php_cgi_num => 填写同时运行 php-cgi 的个数 其他使用默认配置即可 工具简陋,原本供自己使用,现方便有相同需求的人。 压缩包内有邮箱,有疑问可发邮件。

    RunHiddenConsole xxfpm nginx windows php-cgi进程维护工具

    为了解决这个问题,我们可以使用"RunHiddenConsole xxfpm nginx windows php-cgi进程维护工具"。这个工具组合包括了RunHiddenConsole.exe和xxfpm等组件,旨在确保PHP-CGI进程稳定运行。 首先,我们要理解`...

    windows下 解决PHP-CGI 进程崩溃502的资源包

    windows下 解决PHP-CGI 进程崩溃502的资源包,资源包中包括pthreadGC2.dll、registe.bat、restart_cgi.bat、RunHiddenConsole.exe、xxfpm.exe文件,详细使用方法可参考博客文章{windows下 解决PHP-CGI 进程崩溃502}

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

    当PHP-CGI进程占用大量CPU资源时,可能是由于多种原因,如代码错误、无限循环、资源泄露或与外部服务的通信问题等。 在案例中,用户首先描述了其网站架构:使用Nginx作为负载均衡器,连接两台Web服务器,通过NFS...

    PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析

    此外,确认是否是`file_get_contents()`引起CPU使用率过高,可以通过`top`命令查找CPU使用率最高的`php-cgi`进程,并进一步检查其执行的脚本,或者使用类似`strace`的工具进行进程跟踪,观察是否有长时间阻塞在`file...

    xxfpm.rar(windows下的php-cgi管理工具)

    6. **安全性增强**:通过限制单个进程的资源使用,如内存和CPU,防止恶意脚本消耗过多资源,增加系统的安全性。 **使用xxfpm的步骤** 1. **下载安装**:获取xxfpm的压缩包,解压至服务器的合适位置。 2. **配置...

    php-cgi进程cpu负载过高:禁用wordpress定时任务wp-cron.php

    当遇到PHP-CGI进程CPU负载过高时,应首先通过监控工具(如`top`、`strace`)找出占用资源的进程或函数。在本案例中,`wp-cron.php`定时任务是罪魁祸首。禁用WP-Cron可以有效地降低服务器负载。同时,定期检查并优化...

    Windows下Nginx和php-cgi的bat批处理快速启动方法

    它以其高性能和低内存占用而著名。而PHP-CGI是PHP的一个版本,通过CGI(通用网关接口)协议与Web服务器进行交互,用于处理动态内容。 1. **安装Nginx和PHP-CGI** 在Windows上,你需要下载Nginx和PHP的Windows二...

    处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题

    当FastCGI进程因为负载、资源限制或配置不当而未能在规定时间内完成任务时,就会导致超时错误。这个标签指明了解决问题时需要关注的核心概念,即PHP进程的运行效率和超时设置。 详细内容中的知识点:在详细内容部分...

    Linux下php-cgi占内存100%电脑变的很卡的解决方法.docx

    在Linux系统中,当php-cgi进程占用...综上所述,解决Linux环境下php-cgi进程高CPU占用问题,通常需要结合日志分析、配置调整、代码优化和安全检查等多方面的方法。通过这些措施,可以有效地提升服务器的性能和稳定性。

    php-cgi+mysql+nginx一键安装包for CentOS V5 part3

    本安装文件修改了源码网的“CentOS 集成linux+php-cgi+nginx+mysql安装包“里面的部分文件,主要是修改了install.sh内的几个错误位置。目前我测试在centos 5.4下,安装一切正常! 使用这个安装之前请一定看一下本...

    什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI.pdf

    FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。 FastCGI与CGI特点: 1. 语言无关性 2. 独立于核心web服务器运行 3. 支持多种语言,包括C/C++、...

    解决Linux下php-fpm进程过多导致内存耗尽问题

    在Linux系统中,PHP-FPM (FastCGI Process Manager) 是用于管理PHP进程的一个高效解决方案。然而,当php-fpm进程过多时,可能会导致服务器内存耗尽,从而影响到其他服务的正常运行,比如数据库服务。本篇文章将详细...

    处理(php-cgi.exe – FastCGI 进程超过了配置的请求超时时限)的问题

    – FastCGI 进程超过了配置的请求超时时限【环境】:php + IIS7.5解决办法:方法一:C:\Windows\System32\inetsrv\config\applicationHost.config 进行编辑,将activityTimeout设置调大,默认为600(10分钟),最大...

    Windows下PHP-CGI 作为进程管理器

    Windows下PHP-CGI 作为进程管理器

    PHP-CGI远程代码执行漏洞分析与防范

    FastCGI则解决了CGI的性能问题,它允许PHP进程持续运行,接收并处理多个请求,提高了系统资源利用率。PHP-CGI可以以两种模式运行:CGI和FastCGI。当以FastCGI模式运行时,PHP-CGI可以作为一个管理器,监听特定端口...

Global site tag (gtag.js) - Google Analytics