誰貪佔了個人系統資源 php-fpm

編者按:本文的分析思路值得參考。php

測試人員向咱們反映:在Facebook平臺的遊戲比其它平臺的遊戲明顯更慢。我詢問,是否是由於×××網絡緣由。他們說:不是,其它遊戲也比較流暢。mysql

使用httpwatch查看了http請求,發現api.php請求花了6秒,且大部分時間是紅色(httpwatch紅色表示服務器運算時間)。日常2秒,如今6秒,服務器處理時間在不一樣的服務器相差這麼多。nginx

直覺告訴:服務器資源。sql

服務器概況

  • 操做系統:CentOS5.3-64-2.6.18-164.el5api

  • 應用服務Nginx0.六、PHP-Fpm、MySQL5.一、PHP5.二、Memcached服務器

  • Memcached僅cached遊戲系統設置與模板參數據網絡

故障檢測

1.別的先無論,先top看一下cpu、ram、swap哪一個比較緊張。ide

perfgeeks-599-1memcached

由上圖分析,能夠看出共有602個進程,其中有601個進程休眠了。這好像有點不對勁,內核進程也就80個左右,加上memcached, nginx, mysqld,也不會超出90個。除了這些,剩下的只有php-fpm管理的php-cgi,難道是…?php-fpm

CPU顯示,CPU壓力並不大,能夠說沒有壓力。咱們再看內存使用概要,發現4G的內存,消耗得所剩餘無幾(free+buffers), 95%以上的內存都已分配。交互空間使用狀況,咱們暫時不去關心。指令top還列出了佔用資源最多的進程,運行時間最久(Time+)的mysqld(約2小時)佔用資源並非最多。另外,再看php-cgi,單個php-cgi佔用的內存也不算多。因此,能夠大膽地猜測:服務器內存資源比較緊張,並無被某個進程佔用大量內存,有可能被某些掛起的進程佔着內存沒有釋放。經過free進一步監控內存使用狀況,驗證咱們的想法。

2.指令free,瞭解RAM資源使用狀況。固然,你也能夠查看文件/proc/meminfo

perfgeeks-599-2

咱們先來看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監控內存使用狀況

perfgeeks-599-3

做爲對內存監控,咱們比較關心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-cgi進程。

5. 設置php-fpm進程數量管理

經過從新將php-conf.conf的max_children值設置爲150,系統內存又恢復到正常使用狀況。free、si、so、b均表示內存系統資源正常,沒有壓力。

perfgeeks-599-4

php-cgi進程釋放的內存並不會被系統當即回收,一個php-cgi大概佔用20MB內存(取決於你加載的php extensions)。因此,有必要限制你啓動的php-cgi進程數量。那麼,這個數量多少合適呢,你能夠在服務器高峯期經過top統計出php-cgi數量。也能夠像php-fpm建議的那樣,經過netstat -np | grep 127.0.0.1:9000來收集數據,經過設置max_children使等待的數量儘可能小

6.一個php-cgi佔用多少內存

一個php-cgi進程,大概佔用多少內存呢,大概是20MB(具體的要看你的php加載了多少模塊)。能夠經過pmap指令查看哪些地方佔用了內存。因此,儘可能不要加載沒必要要的php擴展模塊,能夠減小沒必要要的內存浪費。

原文發佈時間爲:2013-06-25

本文來自雲棲社區合做夥伴「Linux中國」

相關文章
相關標籤/搜索