1.別的先無論,先top看一下cpu、ram、swap哪一個比較緊張。php
由上圖分析,能夠看出共有602個進程,其中有601個進程休眠了。這好像有點不對勁,內核進程也就80個左右,加上memcached, nginx, mysqld,也不會超出90個。除了這些,剩下的只有php-fpm管理的php-cgi,難道是…?
CPU顯示,CPU壓力並不大,能夠說沒有壓力。咱們再看內存使用概要,發現4G的內存,消耗得所剩餘無幾(free+buffers), 95%以上的內存都已分配。交互空間使用狀況,咱們暫時不去關心。指令top還列出了佔用資源最多的進程,運行時間最久(Time+)的mysqld(約 2小時)佔用資源並非最多。另外,再看php-cgi,單個php-cgi佔用的內存也不算多。因此,能夠大膽地猜測:服務器內存資源比較緊張,並無 被某個進程佔用大量內存,有可能被某些掛起的進程佔着內存沒有釋放。經過free進一步監控內存使用狀況,驗證咱們的想法。html
2.指令free,瞭解RAM資源使用狀況。固然,你也能夠查看文件/proc/meminfomysql
咱們先來看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額定值,須要換出內存頁。nginx
查看free結果的時候,咱們主要查看第二行。一眼就能看出4G的內存,其中有3898M內存被用了,還有49M內存沒有,都快用完了。這也證明了咱們第 一步的猜測,內存被用完。這裏,咱們進一步猜測,內存空間嚴重不足的狀況下,進程會被blocked,系統會不斷地將不用的數據換出so,將要用的數據讀 入si。咱們能經過vmstat進一步驗證,咱們的這個猜測。sql
3.指令vmstat監控內存使用狀況bash
做爲對內存監控,咱們比較關心swpd、free、si、so。通常系統不繁忙的狀態下,咱們看到swpd,so的值不會持續很高,常常爲0。這裏,咱們 看到swpd值爲1.5G,以及free值很小,再一次代表物理內存不足。其中si報告了每秒從swap區移入到物理內存的內存總量,so報告了每秒從物 理內存移出到swap區的內存總量。固然,si有時較大,並不要過份的焦慮,常常碰到一個程序須要較大內存來讀寫媒體文件時,si值就會變大。反卻是 so,它一般是一個內存緊缺的一個信號,若是長時間這個值一直保持較大的話,則頗有可能內存不夠,小額波動,能夠不用理會。接下來,能夠經過ps找出消耗 內存的元兇。服務器
4.指令ps找出消耗內存的元兇ssh
[root@localhost ~]# ps -A --sort -rss -o comm,pmem,pcpu |uniq -c |head -15 1 COMMAND %MEM %CPU 1 mysqld 0.6 0.0 503 php-cgi 0.3 0.0 5 php-cgi 0.2 0.0 1 php-cgi 0.1 0.0 1 php-cgi 0.0 0.0 1 memcached 0.0 0.0 1 sshd 0.0 0.0 1 nginx 0.0 0.0 1 sshd 0.0 0.0 1 nginx 0.0 0.0 2 bash 0.0 0.0 3 nginx 0.0 0.0 1 sshd 0.0 0.0 1 nginx 0.0 0.0
指令ps比較經常使用,也比較簡單。上面報告結果,咱們一眼就能夠命中php-cgi這個進程。雖然單個php-cgi佔用內存並不算太大,可是503 個php-cgi進程,就有點恐怖了。幾乎佔盡了所有內存(503*0.3%)。咱們能夠猜測,php-cgi由php-fpm管理,是否是能夠php- fpm的某個參數配置不當,致使打開過多的php-cgi進程。ide
5.設置php-fpm進程數量管理memcached
經過從新將php-conf.conf的max_children值設置爲150,系統內存又恢復到正常使用狀況。free、si、so、b均表示內存系統資源正常,沒有壓力。
php-cgi進程釋放的內存並不會被系統當即回收,一個php-cgi大概佔用20kb內存(取決於你加載的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。能夠經過pmap指令查看哪些地方佔用了內存。因此,儘可能不要加載沒必要要的php擴展模塊,能夠減小沒必要要的內存浪費。
[root@localhost etc]# pmap $(pgrep php-cgi |head -1) 6746: /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm.conf 0000000000400000 6680K r-x– /usr/local/php/bin/php-cgi 0000000000c86000 268K rw— /usr/local/php/bin/php-cgi 0000000000cc9000 56K rw— [ anon ] 0000000005012000 2240K rw— [ anon ] 0000003efd200000 112K r-x– /lib64/ld-2.5.so ……. 00002ac28a7a5000 2048K —– /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xhprof.so 00002ac28a9a5000 4K rw— /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xhprof.so 00002ac28a9a6000 84K r-x– /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/apc.so 00002ac28a9bb000 2048K —– /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/apc.so 00002ac28abbb000 8K rw— /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/apc.so 00002ac28abbd000 32K rw— [ anon ] 00002ac28abd4000 40K r-x– /lib64/libnss_files-2.5.so 00002ac28abde000 2044K —– /lib64/libnss_files-2.5.so 00002ac28addd000 4K r—- /lib64/libnss_files-2.5.so 00002ac28adde000 4K rw— /lib64/libnss_files-2.5.so 00007fffa717e000 84K rw— [ stack ] ffffffffff600000 8192K —– [ anon ] total 154172K
7.使用xhprof、xdebug、tideways(PHP7)分析PHP程序內存等使用狀況
點擊下載Windows下 xhprof 擴展,Windows 下經常使用擴展下載(http://dev.freshsite.pl/php-accelerators.html)
8.nginx配合php-fpm,開啓php-fpm自帶實時監控(/status)
9.今天還碰到一種狀況,set_time_limit(0),致使全部的php-fpm都會一直執行,直到達到最大分配值,新請求沒法被響應。
轉自:http://blog.csdn.net/pestd/article/details/26230351