最近php-fpm服務器經常內存偏高。
最簡單也是馬上見效的方法是重啟服務,干脆重啟服務器,這個對于某些臨時進程導致的內存虛高可能有效,這里顯然是不行滴。很可能影響到業務。
查看服務器內存及進程狀況
下面對每個參數的意義進行簡要的概述分析
pm=dynamic
該項共有三種設置方式 static 、 dynamic 、ondemand
一種是pm = static,始終保持一個固定數量的子進程,這個數由pm.max_children定義,這種方式很不靈活,也通常不是默認的。
另一種是pm = dynamic,他是這樣的,啟動時,會產生固定數量的子進程(由pm.start_servers控制)可以理解成最小子進程數,而大子進程數則由pm.max_children去控制,這樣的話,子進程數會在大和最小數范圍中變化,還沒有完,閑置的子進程數還可以由另2個配置控制,分別是pm.min_spare_servers和pm.max_spare_servers,也就是閑置的子進程也可以有最小和大的數目,而如果閑置的子進程超出了pm.max_spare_servers,則會被殺掉。(注意,pm.max_spare_servers應小于pm.max_children)
可以看到,pm = dynamic模式非常靈活,也通常是默認的選項。但是,dynamic模式為了大化地優化服務器響應,會造成更多內存使用,因為這種模式只會殺掉超出大閑置進程數(pm.max_spare_servers)的閑置進程,比如大閑置進程數是30,大進程數是50,然后網站經歷了一次訪問高峰,此時50個進程全部忙碌,0個閑置進程數,接著過了高峰期,可能沒有一個請求,于是會有50個閑置進程,但是此時php-fpm只會殺掉20個子進程,始終剩下30個進程繼續作為閑置進程來等待請求,這可能就是為什么過了高峰期后即便請求數大量減少服務器內存使用卻也沒有大量減少,也可能是為什么有些時候重啟下服務器情況就會好很多,因為重啟后,php-fpm的子進程數會變成最小閑置進程數,而不是之前的大閑置進程數。
max_requests
即是說每個進程若超過這個數目(跟php進程有一點點關系,關 系不大),就自動殺死.
max_children
大進程數,一般來說一臺服務器正常情況下每一個php-fpm所耗費的內存在40M左右,理想大進程數可計算為1000/40=25,但是實際上內存不止有php-fpm在占用,故可根據實際情況來,適當減小使得內存不會因php-fpm進程過多而耗盡。而如果我 的”max_children”設置的較小,比如5-10個,那么php-fpm就會“很累”,處理速度也很慢,等待的時間也較長。如果長時間沒有得到處 理的請求就會出現504 Gateway Time-out這個錯誤。
request_terminate_timeout
據你服務器的性能進行設定。一般來說性能越好你可以設置越高,20分鐘-30分鐘都可以。由于我的服務器PHP腳本需要長時間運行,有的可能會超過10分 鐘因此我設置了1200秒,這樣不會導致php-fpm死掉而出現502 Bad gateway這個錯誤。
pm.start_servers
動態方式下的起始php-fpm進程數量
pm.min_spare_servers
動態方式下的最小php-fpm閑置進程數
pm.min_spare_servers
動態方式下的大php-fpm閑置進程數量
由于方便管理把php-fpm配置文件拆開了。在/opt/plesk/php/7.1/etc/php-fpm.d目錄下
這樣我們就可以定位到是哪個占用
[root@orion php-fpm.d]# ls
aabus.com.conf coachrun.com.conf jadiamortgage.com.conf jadia.net.conf livechat.taketours.com.conf lltours.com.conf sunshineboston.com.conf
[root@orion php-fpm.d]# vim livechat.taketours.com.conf
這是之前的配置文件:
pm = ondemand #按需ondemand
pm.max_children = 5 #大進程數
pm.max_spare_servers = 1 #動態方式下的大php-fpm閑置進程數量
pm.min_spare_servers = 1 #動態方式下的最小php-fpm閑置進程數
pm.process_idle_timeout = 10s #按需方式下多長時間殺掉php-fpm子進程,直到master進程
pm.start_servers = 1 #動態方式下的起始php-fpm進程數量
修改后的配置:
pm = ondemand
pm.max_children = 5
pm.max_spare_servers = 2
pm.min_spare_servers = 2
pm.process_idle_timeout = 10s
pm.start_servers = 1
pm.max_requests = 1024 指的是每個子進程在處理了1024個請求數量之后就重啟
跟蹤一陣時間后發現內存在30000kb左右波動,進程使用的物理內存百分比才0.1%
參考文章: https://www.centos.bz/2018/03/php-fpm%E8%BF%9B%E7%A8%8B%E8%BF%87%E5%A4%9A%EF%BC%8C%E5%86%85%E5%AD%98%E8%80%97%E5%B0%BD/
另外有需要云服務器可以了解下創新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。