天堂中文最新版在线官网在线,免费在线观看,黄色网站,深夜激情网,欧美,另类,国产

php-cgi進程占用cpu資源過多負載高的原因分析及解決步驟

19-12-25    1923次

在此環(huán)境下,一般php-cgi運行是非常穩(wěn)定的,但也遇到過php-cgi占用太多cpu資源而導致服務器響應過慢,我所遇到的php-cgi進程占用cpu資源過多的原因有:                                                  timg (3).jpg


 


1. 一些php的擴展與php版本兼容存在問題,實踐證明 eAccelerater與某些php版本兼容存在問題,具體表現(xiàn)時啟動php-cgi進程后,運行10多分鐘,奇慢無比,但靜態(tài)資源訪問很快,服務器負載也很正常(說明nginx沒有問題,而是php-cgi進程的問題),解決辦法就是從php.ini中禁止掉eAccelerater模塊,再重啟php-cgi進程即可


 


2. 程序中可能存在死循環(huán),導致服務器負載超高(使用top指令查看負載高達100+), 需要借助Linux的proc虛擬文件系統(tǒng)找到具體的問題程序


 


3. php程序不合理使用session , 這個發(fā)生在開源微博記事狗程序上,具體表現(xiàn)是有少量php-cgi進程(不超過10個)的cpu使用率達98%以上, 服務器負載在4-8之間,這個問題的解決,仍然需要借助Linux的proc文件系統(tǒng)找出原因。


 


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;

}


 


沒有對傳入的參數(shù)作任何初步檢查,而且設置了永不超時,并且使用readfile一次讀取超大文件,就可能存在以下問題:

 A. 以http方式讀取遠程附件過度耗時


 B. FTP無法連接時,如何及時反饋出錯誤?


 C. readfile是一次性讀取文件加載到內存中并輸出,當文件過大時,內存消耗驚人


      根據(jù)實驗發(fā)現(xiàn)采用readfile一次性讀取,內存消耗會明顯增加,但是CPU的利用率會下降較多。如果采用分段讀取的方式,內存消耗會稍微下降,而CPU占用卻會明顯上升。


 


對discuz x 1.5的這個bug較好解決方法就是后臺重新正確設置遠程附件參數(shù)。


 


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


1. 得到占用cpu資源過多的php-cgi進程的pid(進程id), 使用top命令即可,如下圖:


 





經(jīng)過上圖,我們發(fā)現(xiàn),有兩個php-cgi進程的cpu資源占用率過高,pid分別是10059,11570,這一般都是程序優(yōu)化不夠造成,如何定位問題的php程序位置?


 


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


/proc/文件系統(tǒng)保存在內存中,主要保存系統(tǒng)的狀態(tài),關鍵配置等等,而/proc/目錄下有很多數(shù)字目錄,就是進程的相關信息,如下圖,我們看看進程10059正在使用哪些文件?





顯然,使用了/home/tmp/sess_*文件,這明顯是PHP的session文件, 我們查看這個session文件的內容為:view_time|123333312412


 


到這里,我們已經(jīng)可以懷疑是由于php程序寫入一個叫view_time的session項而引起, 那么剩余的事件就是檢查包含view_time的所有php文件,然后修改之(比如改用COOKIE),這實話, 這個view_time并非敏感數(shù)據(jù),僅僅記錄用戶最后訪問時間,實在沒必要使用代價巨大的session, 而應該使用cookie。


 


3. 找出有問題的程序,修改之


使用vi編輯以下shell程序(假設網(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


 


運行這個shell程序,將輸出包含有view_time的文件, 對記事狗微博系統(tǒng),產生的問題位于modules/topic.mod.class文件中




以上【 php-cgi進程占用cpu資源過多負載高的原因分析及解決步驟 】的內容由達設互動(http://www.allclubs.com.cn)為您提供,本文網(wǎng)址 : http://www.allclubs.com.cn/wangzhanjianshezhishi/214.html ,轉載請注明出處!更多有關深圳網(wǎng)站建設,微信小程序、電商平臺建設、系統(tǒng)開發(fā)等互聯(lián)網(wǎng)應用服務都可以聯(lián)系我們。熱線:130 7784 6582

掃描二維碼微信聊天

在線咨詢
聯(lián)系電話

130 7784 6582