在以往的開發過程中,碰到過php-fpm的原因導致CPU負載過高,load 20~50,嚴重影響了安全和服務穩定的問題,那怎么來查看和分析問題呢?請看下文。
1. 查看是否是硬件問題
方式:top 命令
主要查看:load average(平均負載),這是一個4核8G內存的服務器
1分鍾平均負載:2.32;
5分鍾平均負載:2.18;
15分鍾平均負載:3.95;
load average 中3個數的含義,如果是1核cpu,那么不能超過1,4核那么就不能超過4,15分鍾可以代表長期,5分鍾代表中期,1分鍾代表短期,所以先看15分鍾
可以說它現在的平均負載接近了它的cpu總核數:4;需要考慮服務器配置升級!
2.查看是否是PHP-fpm的進程數過多
首先使用 free -m
指令查看當前服務器執行狀況:
可以看到我的內存消耗不多,也能看到我是2G內存
然后再用 top 命令 m 參數 查看內存情況
再使用:ps auxw|head -1;
ps auxw| sort -rn -k4| head -40 查看消耗內存最多的前40個進程
查看通過命令查看服務器上一共開了多少的 php-cgi 進程:
ps -fe |grep
"php-fpm"
|grep
"pool"
|wc -l 這個表示的是開通了多少,實際使用的要看具體的參數;
查看已經有多少個php-cgi進程用來處理tcp請求:
netstat -anp|grep
"php-fpm"
|grep
"tcp"
|grep
"pool"
|wc -l
設置PHP-FPM的進程數:vi
/etc/php-fpm
.d
/www
.conf(根據實際情況變化)找到
pm.max_children
字段,設置一個合理的值,看你使用的靜態模式還是動態模式,一般對於機器性能較高的配置采用靜態模式。對於動態模式,比之前的小
pm.max_spare_servers
: 該值表示保證空閑進程數最大值,如果空閑進程大於此值,此進行清理 pm.min_spare_servers
: 保證空閑進程數最小值,如果空閑進程小於此值,則創建新的子進程;
這兩個值均不能不能大於 pm.max_children
值,通常設置 pm.max_spare_servers
值為 pm.max_children
值的60%-80%。
正常情況下,一個php--fpm占用內存20~30M,可以通過內存計算你可以開通的最大進程數量。
3.進程跟蹤
1.使用 top 找出CPU最高的進程pid
2.strace -p PID(進程數) 來跟蹤進程
3. ll /proc/PID/fd 來查看該進程在處理哪些文件
最后修改對應代碼