服务器出现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自动启动