pm = static
靜態,始終保持一個固定數量的子進程,這個數由(pm.max_children)定義,這種方式很不靈活,也通常不是默認的。
pm = dynamic
動態,在更老一些的版本中,dynamic被稱作apache-like。子進程的數量在下面配置的基礎上動態設置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers。
啟動時,會產生固定數量的子進程(由pm.start_servers
控制)可以理解成最小子進程數,而最大子進程數則由pm.max_children
去控制,OK,這樣的話,子進程數會在最大和最小數范圍中變化,還沒有完,閑置的子進程數還可以由另2個配置控制,分別是pm.min_spare_servers
和pm.max_spare_servers
,也就是閑置的子進程也可以有最小和最大的數目,而如果閑置的子進程超出了pm.max_spare_servers
,則會被殺掉。
可以看到,pm = dynamic
模式非常靈活,也通常是默認的選項。但是,dynamic
模式為了最大化地優化服務器響應,會造成更多內存使用,因為這種模式只會殺掉超出最大閑置進程數(pm.max_spare_servers
)的閑置進程,比如最大閑置進程數是30,最大進程數是50,然后網站經歷了一次訪問高峰,此時50個進程全部忙碌,0個閑置進程數,接着過了高峰期,可能沒有一個請求,於是會有50個閑置進程,但是此時php-fpm
只會殺掉20個子進程,始終剩下30個進程繼續作為閑置進程來等待請求,這可能就是為什么過了高峰期后即便請求數大量減少服務器內存使用卻也沒有大量減少,也可能是為什么有些時候重啟下服務器情況就會好很多,因為重啟后,php-fpm
的子進程數會變成最小閑置進程數,而不是之前的最大閑置進程數。
pm = ondemand
進程在有需求時才產生,與 dynamic 相反,pm.start_servers 在服務啟動時即啟動。
這種模式把內存放在第一位,他的工作模式很簡單,每個閑置進程,在持續閑置了pm.process_idle_timeout
秒后就會被殺掉,有了這個模式,到了服務器低峰期內存自然會降下來,如果服務器長時間沒有請求,就只會有一個php-fpm
主進程,當然弊端是,遇到高峰期或者如果pm.process_idle_timeout
的值太短的話,無法避免服務器頻繁創建進程的問題,因此pm = dynamic
和pm = ondemand
誰更適合視實際情況而定。
涉及到的參數:
- pm.max_children:靜態方式下開啟的php-fpm進程數量。
- pm.start_servers:動態方式下的起始php-fpm進程數量。
- pm.min_spare_servers:動態方式下的最小php-fpm進程數量。
- pm.max_spare_servers:動態方式下的最大php-fpm進程數量。
如果pm設置為static,那么其實只有pm.max_children這個參數生效。系統會開啟設置的數量個php-fpm進程。
如果pm設置為dynamic,那么pm.max_children參數失效,后面3個參數生效。系統會在php-fpm運行開始的時候啟動 pm.start_servers個php-fpm進程,然后根據系統的需求動態在pm.min_spare_servers和 pm.max_spare_servers之間調整php-fpm進程數。