事故記錄 php cgi程序過多導致系統資源耗盡

2021-08-21 15:26:55 字數 2525 閱讀 5043

事故現象:

機房一台伺服器執行一段時間後,突然發現系統資源即將被耗盡!

1)top命令檢視一下系統的cpu ram swap的使用情況

由上圖分析,可以看出

1–共有602個程序,但其中有601個程序休眠了。

這就有點不對勁,這台伺服器的核心程序也就80個左右,加上memcached, nginx, mysqld,也不會超出90個,除了這些,剩下的只有php-fpm管理的php-cgi了。

2–cpu顯示,cpu壓力並不大,可以說沒有壓力。

3–記憶體使用概要,發現4g的記憶體,消耗得所剩餘無幾(free+buffers),95%以上的記憶體都已分配;互動空間使用情況,暫時不去關心。指令top還列出了占用資源最多的程序,執行時間最久(time+)的mysqld(約2小時)占用資源並不是最多。

4–再看php-cgi,單個php-cgi占用的記憶體也不算多。

所以,可以大膽地猜想:伺服器記憶體資源比較緊張,並沒有被某個程序占用大量記憶體,有可能被某些掛起的程序佔著記憶體沒有釋放。通過free進一步監控記憶體使用情況,驗證我們的想法。

2)檢視ram的使用情況

先來看mem統計資訊,total表示物理記憶體總量,約4g。used,表示已分配記憶體,分配了並不表示使用了,包括(buffer&cached)。free指未分配的記憶體,buffers與cached表示分配了但還沒有被使用的記憶體。第二行(buffers/cache)的,used表示真正被使用了記憶體,由第一行的(used-buffer-cached)得到,free則表示還沒有被使用的記憶體,由第一行的(free+buffer+cached)得到。swap行則表示記憶體交換使用情況,少量的(不頻繁地)swpd,是不會影響伺服器效能的,因為系統需要將v型別的記憶體頁面交換出去或者調整了buffer與cached的大小。但是頻繁地swpd,則有可能意味著伺服器物理記憶體不足,小於指定的swap額定值,需要換出記憶體頁。

檢視free結果的時候,主要檢視第二行。一眼就能看出4g的記憶體,其中有3898m記憶體被用了,還有49m記憶體沒有,都快用完了。

這也證實了第一步的猜想,記憶體被用完!

這裡,可以進一步猜想,記憶體空間嚴重不足的情況下,程序會被blocked,系統會不斷地將不用的資料換出so,將要用的資料讀入si。

下面通過vmstat進一步驗證這個猜想。

3)vmstat監控記憶體的使用情況

作為對記憶體監控,比較重要的還是swpd、free、si、so。

一般系統不繁忙的狀態下,可以看到swpd,so的值不會持續很高,經常為0。

這裡看到swpd值為1.5g,以及free值很小,再一次表明物理記憶體不足。其中si報告了每秒從swap區移入到物理記憶體的記憶體總量,so報告了每秒從物理記憶體移出到swap區的記憶體總量。

當然,si有時較大,並不要過份的焦慮,經常碰到乙個程式需要較大記憶體來讀寫**檔案時,si值就會變大。反倒是so,它通常是乙個記憶體緊缺的乙個訊號,如果長時間這個值一直保持較大的話,則很有可能記憶體不夠,小額波動,可以不用理會。接下來,可以通過ps找出消耗記憶體的元凶。

4)ps找出消耗記憶體的元凶

指令ps比較常用,也比較簡單。從上面報告結果中可以一眼看到php-cgi這個程序。雖然單個php-cgi占用記憶體並不算太大,但是503個php-cgi程序,就有點恐怖了。幾乎佔盡了全部記憶體(503*0.3%)。php-cgi由php-fpm管理,因此可以斷定,是由於php-fpm配置檔案php.ini中的max_children引數配置不當,才導致開啟過多的php-cgi程序。所以要適當調整下max_children的設定。

sort -k3 -rn表示按照第3列的值進行降序排列

[root@localhost ~]# ps -a -o comm,pmem,pcpu|uniq -c|head -2

1 command         %mem %cpu

1 init 0.0 0.0

[root@localhost ~]# ps -a -o comm,pmem,pcpu|uniq -c|sort -k1 -rn|head -5

89 zabbix_server    0.0  0.0

59 oracle 2.0 0.0

40 events_power_ef 0.0 0.0

8 nginx 0.0 0.0

7 zabbix_server 0.0 0.0

[root@localhost ~]# ps -a -o comm,pmem,pcpu|uniq -c|sort -k3 -rn|head -5

4 oracle          33.8  0.6

5 oracle 32.3 0.0

1 oracle 15.1 0.5

1 oracle 15.0 0.5

1 oracle 14.9 0.5

*****當你發現自己的才華撐不起野心時,就請安靜下來學習吧*****

PHP CGI程序占用過多CPU

一般情況下,php cgi只在使用者訪問的時候會占用cpu資源,但是最近有同事反映,伺服器上的的php cgi程序占用了非常多的cpu,但是訪問流量卻非常少。這顯然是乙個不正常的現象,說有些地方存在故障。以下導致此問題可能存在的原因,在此與大家分享。1.相容性問題 如果php的擴充套件與php版本相...

PHP CGI程序占用過多CPU

一般情況下,php cgi只在使用者訪問的時候會占用cpu資源,但是最近有同事反映,伺服器上的的php cgi程序占用了非常多的cpu,但是訪問流量卻非常少。這顯然是乙個不正常的現象,說有些地方存在故障。以下導致此問題可能存在的原因,在此與大家分享。1.相容性問題 如果php的擴充套件與php版本相...

記錄一次線上嚴重事故(變更表結構導致商城系統宕機)

事件 早上 7點左右 表更新了 字段精度 500萬級 導致 系統系統不可用 影響 系統從 7點到11點間不可用 嚴重級 報表系統整天不可用 嚴重級 事故解決過程 建立乙個和原來一樣的空表,加上需要變更的表結構,然後把原來表資料複製過來 早上9 30 點左右,表重新建立索引,系統恢復 報表系統同步一直...