服務器出現CPU占用100%,PHP-FPM日志不斷顯示
child xxx exited on signal 15 (SIGTERM) after xxx seconds from start
child xxx started
child xxx exited with code 0 after 0 seconds from start
說明PHP-FPM進程在不斷創建子進程,但一創建就死掉了
還會有提示
seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)
說明啟動的子進程數量已經到底最大值
但通過 ps -ef |grep "php-fpm"|grep "pool"|wc -l命令統計php-fpm進程數量,卻是0個,說明進程確實都是剛創建就死掉了,而且是瞬時創建的子進程數量都超過了最大值,只不過立馬有死掉了
因為不停的創建進程,導致了CPU耗盡
使用strace在服務器正常的時候開始跟蹤php-fpm進程,並記錄時間戳
screen -S strace
strace -s 1024 -tt -T -f -o strace.log -p 某個php-fpm子進程的pid
機器死掉后重啟,查看阿里雲系統監控,找到CPU100%的開始時間,查看strace.log,使用行號定位到CPU100%的那段時間
less -N +行號 strace.log
發現有Too many open files的錯誤,說明是系統的打開文件描述符已經超過上限,PHP-FPM進程不斷重啟就是因為沒有文件描述符可用導致的
ulimit -a #查看各類用戶進程限制,發現最大打開文件描述符數量是65535
...
open files (-n) 65535
max user processes (-u) 65535
...
lsof | wc -l #查看當前已打開文件描述符數量,發現已經快到最大值了
589234
lsof |awk '{print $1}' |sort |uniq -c |sort -nr |head -n10 #查看占用文件描述符最多的10個進程
17821 crond
16784 sendmail
16765 maildrop
...
發現是crond和crond相關的郵件發送進程占用了大量文件描述符
查看郵件日志
less /var/log/maillog
發現大量報錯
postfix/postdrop[16261]: warning: mail_queue_enter: create file maildrop/756739.16261: No such file or directory
說明郵件無法正常發送,postfix服務出現了郵件投遞錯誤
systemctl status postfix #檢查postfix服務狀態,發現服務沒有啟動,且是禁用狀態
systemctl start postfix #啟動服務
lsof | wc -l #檢查打開文件描述符數量,發現已經下降,問題解決
systemctl enable postfix #最后設置postfix自動啟動