1 介紹
PHP從Apache module換成了Fpm,跑了幾天突然發現網站打不開了。
頁面顯示超時,檢查MySQL、Redis一眾服務都正常。
進入Fpm容器查看日志,發現了如下的錯誤信息:
server reached pm.max_children setting (5), consider raising it
2. 原因
原來默認情況下Fpm的系統參數是這樣的:
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
說明一下這些參數:
max_children
最多進程數量
start_servers
啟動時候開啟的進程數量
min_spare_servers
最小空閑進程數量
max_spare_servers
最多空閑進程數量
最多5個進程,這顯然是不夠用的了!
3. 解決
加大子進程數量避免系統崩潰!
平均一個進程占用35M左右的內存,容器分配的內存是1G,1024/35=29,避免內存用光設置少一點,就25個吧!
pm.max_children = 25
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 25
除此之外我們還可以通過max_requests參數讓進程經過一定的服務次數之后重新啟動,這樣可以避免系統崩潰的情況出現。
max_requests參數比較容易理解,就是一個進程服務這么多次數之后就會自動銷毀掉,然后系統根據其他參數自動補充進程。
這個沒有什么算法,服務器訪問量大就設置大一些,訪問量小就設置小一些。
pm.max_requests = 600