《大廠經驗:兩步搞定PHP-FPM優化,讓服務器更平穩》要點:
本文介紹了大廠經驗:兩步搞定PHP-FPM優化,讓服務器更平穩,希望對您有用。如果有疑問,可以聯系我們。
導言:Web服務器的CPU指標和MEM指標異常,不穩定?可能是PHP-FPM進程重啟機制的問題導致的,一同和百度外賣探索下如何優化吧.
猛哥
百度外賣基礎架構部在線開發方向負責人
負責在線開發框架的持續優化和長期演進,主導研發的WFE/WODP/WOSP組成一套完整高效的WEB架構,支撐百度外賣所有在線服務高速高質量地發展.百度外賣基礎架構部在線開發團隊
擅長自底向上地創造和優化基礎框架、基礎庫和基礎服務,對NGINX和PHP有深層次的理解和創新性的改造.天下大事必作于細,百度外賣基礎架構部在線開發團隊,將持續精耕細作,適時發布成熟有效的在線服務優化方案,期待與同行保持交流,共同進步.
通過優化PHP-FPM進程重啟機制,改善線上服務器CPU_IDLE
和MEM_USED
波動的問題,使服務器資源利用率更加平滑可靠.
外賣交易服務集群報出在監控圖上CPU_IDLE
波動劇烈,如圖所示.
事實上一直以來,不僅PU_IDLE
存在一定的波動,MEM_USED
的周期性斷崖式下降再回升也早已司空見慣.那么CPU_IDLE
與MEM_UESD
的波動是否存在關聯,追溯這種現象產生的原因,我們就必須理解PHP-FPM進程管理器的機制.
在PHP5.3.3版本中,PHP-FPM正式被官方收編,作為FastCGI管理器,支持平滑停止啟動進程、slow-log、動態進程、運行狀態等特性.
PHP-FPM進程管理支持三種方式:static
、dynamic
、ondemand
.我們選用的是static
方式,即PHP-FPM生成固定數量的FastCGI進程,這種方式比較簡單,避免了頻繁開啟關閉進程的開銷.(在線下虛擬機環境中,進程管理可以配置成ondemand
,既降低了內存需求又避免了進程數量不夠用)
回到面臨的問題上,CPU_IDLE
和MEM_USED
的周期性波動是如何產生的.首先這是一種所有的集群都存在的現象,然后交易服務集群表現尤為突出.在排查了應用程序(比如日志采集程序、定時腳本)的影響后,思路落在了PHP-FPM的一個關鍵參數上:max_requests
.
max_requests
這個參數使FastCGI進程在處理一定數量的請求后自動重啟,以此避免第三方擴展內存泄漏產生破壞性影響.打開線上配置,發現外賣交易服務集群中配置該參數過小,為1000,這便造成了在請求高峰期,FastCGI頻繁重啟,對CPU產生了負擔.于是將max_requests
參數調整為10000后,CPU_IDLE
表現得到了改善,如圖.
但是經過觀察發現,CPU_IDLE
和MEM_USED
周期性波動的問題并沒有根除,效果如圖.
這很好理解,我們調大max_requests
參數,但是FastCGI重啟機制依然生效,每個請求都會計數,當計數到達max_request
之后,cgi進程會執行 fcgi_finish_request
退出進程,子進程退出,fpm-master
進程會收到SIGCHLD信號,運行fpm_children_bury
重啟進程,重啟的方式是fork一個子進程.
FastCGI進程通過unix socket承接Nginx請求,負載較為均衡,生產環境流量大,PHP進程數配置較大,數以百計的FastCGI會在同一時間到達 max_requests
上限而進行重啟,這便造成了CPU_IDLE
和MEM_USED
周期性波動.
max_requests
的初衷是為了避免第三方擴展引起的內存泄漏問題,雖然線上環境使用的擴展經過分析和測試,并沒有嚴重的內存泄漏問題,但是由于擴展內部使用的第三方庫太多,并無法完全避免內存泄漏問題,同時max_requests
機制很適合FastCGI多進程環境,以較小的代價,換取內存泄漏的長治久安.
為了避免CPU_IDLE
和MEM_USED
周期波動,同時保持max_requests
機制,需要在PHP-FPM源碼上稍作修改.FastCGI進程在啟動時,設置max_requests
,此時只要將max_requests
配置參數散列開,使FastCGI進程分別配置不同的值,即可達到效果.
具體代碼在sapi/fpm/fpm/fpm.c
,修改如下:
php_mt_srand(GENERATE_SEED()); *max_requests=fpm_globals.max_requests+php_mt_rand()&8191;
經過修改上線,對比效果見下圖
至此CPU_IDLE
和MEM_USED
已經告別了周期性波動,避免了CPU計算資源產生浪涌效果,內存占用數據也更加真實可靠.
以此文拋磚引玉,PHP-FPM在生產環境的精細優化,任重而道遠.
文章來自微信公眾號:高效運維
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/1977.html