php-cgi cpu很高,php-cgi占用cpu资源过高的解决方法
轉(zhuǎn)的網(wǎng)上的,不過(guò)對(duì)PHP-CGI菜鳥(niǎo)的人,還是有點(diǎn)幫助的。
1. 一些php的擴(kuò)展與php版本兼容存在問(wèn)題,實(shí)踐證明 eAccelerater與某些php版本兼容存在問(wèn)題,具體表現(xiàn)時(shí)啟動(dòng)php-cgi進(jìn)程后,運(yùn)行10多分鐘,奇慢無(wú)比,但靜態(tài)資源訪問(wèn)很快,服務(wù)器負(fù)載也很正常(說(shuō)明nginx沒(méi)有問(wèn)題,而是php-cgi進(jìn)程的問(wèn)題),解決辦法就是從php.ini中禁止掉eAccelerater模塊,再重啟php-cgi進(jìn)程即可
2. 程序中可能存在死循環(huán),導(dǎo)致服務(wù)器負(fù)載超高(使用top指令查看負(fù)載高達(dá)100+), 需要借助Linux的proc虛擬文件系統(tǒng)找到具體的問(wèn)題程序
3. php程序不合理使用session , 這個(gè)發(fā)生在開(kāi)源微博記事狗程序上,具體表現(xiàn)是有少量php-cgi進(jìn)程(不超過(guò)10個(gè))的cpu使用率達(dá)98%以上, 服務(wù)器負(fù)載在4-8之間,這個(gè)問(wèn)題的解決,仍然需要借助Linux的proc文件系統(tǒng)找出原因。
4. 程序中存在過(guò)度耗時(shí)且不可能完成的操作(還是程序的問(wèn)題),例如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;
}
沒(méi)有對(duì)傳入的參數(shù)作任何初步檢查,而且設(shè)置了永不超時(shí),并且使用readfile一次讀取超大文件,就可能存在以下問(wèn)題:
A. 以http方式讀取遠(yuǎn)程附件過(guò)度耗時(shí)
B. FTP無(wú)法連接時(shí),如何及時(shí)反饋出錯(cuò)誤?
C. readfile是一次性讀取文件加載到內(nèi)存中并輸出,當(dāng)文件過(guò)大時(shí),內(nèi)存消耗驚人
根據(jù)實(shí)驗(yàn)發(fā)現(xiàn)采用readfile一次性讀取,內(nèi)存消耗會(huì)明顯增加,但是CPU的利用率會(huì)下降較多。如果采用分段讀取的方式,內(nèi)存消耗會(huì)稍微下降,而CPU占用卻會(huì)明顯上升。
對(duì)discuz x 1.5的這個(gè)bug較好解決方法就是后臺(tái)重新正確設(shè)置遠(yuǎn)程附件參數(shù)。
以下是我逐步整理的故障排除步驟:
1. 得到占用cpu資源過(guò)多的php-cgi進(jìn)程的pid(進(jìn)程id), 使用top命令即可,如下圖:
經(jīng)過(guò)上圖,我們發(fā)現(xiàn),有兩個(gè)php-cgi進(jìn)程的cpu資源占用率過(guò)高,pid分別是10059,11570,這一般都是程序優(yōu)化不夠造成,如何定位問(wèn)題的php程序位置?
2. 找出進(jìn)程所使用的文件
/proc/文件系統(tǒng)保存在內(nèi)存中,主要保存系統(tǒng)的狀態(tài),關(guān)鍵配置等等,而/proc/目錄下有很多數(shù)字目錄,就是進(jìn)程的相關(guān)信息,如下圖,我們看看進(jìn)程10059正在使用哪些文件?
顯然,使用了/home/tmp/sess_*文件,這明顯是PHP的session文件, 我們查看這個(gè)session文件的內(nèi)容為:view_time|123333312412
到這里,我們已經(jīng)可以懷疑是由于php程序?qū)懭胍粋€(gè)叫view_time的session項(xiàng)而引起, 那么剩余的事件就是檢查包含view_time的所有php文件,然后修改之(比如改用COOKIE),這實(shí)話, 這個(gè)view_time并非敏感數(shù)據(jù),僅僅記錄用戶(hù)最后訪問(wèn)時(shí)間,實(shí)在沒(méi)必要使用代價(jià)巨大的session, 而應(yīng)該使用cookie。
3. 找出有問(wèn)題的程序,修改之
使用vi編輯以下shell程序(假設(shè)網(wǎng)站程序位于/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
運(yùn)行這個(gè)shell程序,將輸出包含有view_time的文件, 對(duì)記事狗微博系統(tǒng),產(chǎn)生的問(wèn)題位于modules/topic.mod.class文件中
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的php-cgi cpu很高,php-cgi占用cpu资源过高的解决方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 颐和园绕一圈多少公里
- 下一篇: 地下城与勇士剧情模式怎么变成空格键