服务器环境: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
分享到:
相关推荐
使用`top`命令检查系统状态,用户发现多个PHP-CGI进程占用CPU资源极高。这表明可能存在某个或某些PHP脚本导致了CPU的过度使用。进一步使用`ls -l /proc/进程ID/fd/`命令查看进程打开的文件描述符,结果显示这些进程...
但这种方式也存在一些缺点,比如资源消耗较大,每个Apache工作进程都会加载整个PHP解释器,如果并发请求多,可能会造成内存占用过高。 mod_fastcgi则是另一种处理PHP请求的方式,它使用FastCGI协议与PHP解释器进行...
计算公式为:`max_children = (服务器内存 - 保留内存) / 单个php-cgi进程占用内存`。 - `request_terminate_timeout`设置PHP脚本的最大执行时间。如果设置为0,表示无限制;非0值则为超时时间,防止脚本因无限循环...
这个错误可能是由于多种原因引起的,比如后端服务未运行、超时设置过短或者负载过高导致的资源耗尽。下面我们将详细探讨如何解决Nginx + PHP(FastCGI)环境中的502 Bad Gateway错误。 首先,我们需要理解Nginx与...
FastCGI是一种常驻型的进程管理方式,相比于传统的CGI,它可以提高性能,减少资源消耗。 2. **轻量级**:Nanoweb设计时考虑了资源效率,它的体积小,启动快,适合于内存有限的设备或者对服务器性能要求不高的场景。...
- **资源节约**:有效降低服务器CPU和内存的占用率,提高整体系统的稳定性。 - **负载减轻**:减少服务器的处理负担,缩短页面加载时间,并降低对后端数据库的压力。 - **用户承载量提升**:允许更多用户同时访问...
操作步骤:在“IIS管理器”中,通过“应用程序池”配置最大工作进程数,并可启用CPU监视等功能进一步优化。 ### 结论 综上所述,通过对IIS6.0进行合理的配置与优化,不仅可以显著提高Web服务器的性能,还能有效...
1. **CPU和内存使用状况探测**:通过iProber,你可以实时查看服务器的CPU占用率和内存使用情况。这对于监控服务器资源消耗,预防过载和性能瓶颈至关重要。了解这些数据有助于在系统负载过高时采取相应措施,如调整...
3. **低资源消耗**:Nginx对系统内存和CPU的占用率非常低,这对于资源有限的服务器环境尤为重要。 4. **健康检查机制**:Nginx可以自动检测后端服务器的状态,并将请求转发到健康的服务器上,确保服务的连续性和可靠...