PHP-FPM 開啟過多線程導致 MySQL crash

Jerry Chen
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,若小於此值則建立子線程

--

--

Jerry Chen
Jerry Chen

No responses yet