PHP-FPM 開啟過多線程導致 MySQL crash
Apr 10, 2020
以 Linux Centos 8 做為系統環境,並安裝 Apache、PHP-FPM、MySQL 等服務,服務正常情況下均運作正常,但只要反覆在瀏覽器重新整理或其他方式導致 PHP-FPM 開啟過多線程,將會占用主機記憶體且無法釋放,此時 MySQL 將因為記憶體不足的關係而 crash。
但此狀況只要重起 PHP-FPM 即可恢復正常,因此判斷是 PHP-FPM 線程為 MySQL crash 主因,為了解決這個狀況需調整 PHP-FPM 線程限制,可透過指令查詢 PHP-FPM 線程與主機記憶體使用狀況。
查詢 PHP-FPM 線程:ps aux | grep php-fpm
查詢主機記憶體使用狀況:free -m
開啟 PHP-FPM 設定檔:vim /etc/php-fpm.d/www.conf,並將選項修正為下方內容。
pm = dynamic
pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
選項說明
- pm.max_children:子線程,每一線程佔用約 1% ~ 2.5% 記憶體
- pm.max_spare_servers:線程最大值,不可大於 pm.max_children,若大於此值則清理子線程
- pm.min_spare_servers:線程最小值,不可小於 pm.max_children,若小於此值則建立子線程