php-fpm: pool www 进程很多,cpu 和 内存占用很大,怎么办?
今天,我发现网站的加载时间变长了,然后就连上 ssh 看了下 vps ,好家伙,cpu 直接 90% 了,然后又用 ps aux 查看 cpu 和内存占用情况,发现 php-fpm: pool www 进程很多
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND www 843 3.1 1.2 171972 24948 ? S Apr18 0:35 php-fpm: pool www www 844 4.6 1.4 176356 28900 ? S Apr18 0:31 php-fpm: pool www www 845 3.3 1.6 178880 32044 ? S Apr18 0:30 php-fpm: pool www www 846 5.1 1.5 177060 30288 ? S Apr18 0:34 php-fpm: pool www www 852 2.9 1.1 171800 22812 ? S Apr18 0:59 php-fpm: pool www www 853 4.1 1.6 179840 31956 ? S Apr18 0:31 php-fpm: pool www www 854 3.8 1.2 170132 24008 ? S Apr18 0:33 php-fpm: pool www www 855 4.0 1.2 170752 24052 ? S Apr18 0:30 php-fpm: pool www www 856 1.9 1.5 177728 30256 ? S Apr18 0:30 php-fpm: pool www www 857 5.1 1.5 177100 31260 ? S Apr18 0:32 php-fpm: pool www www 897 3.7 1.1 171912 23484 ? S Apr18 0:32 php-fpm: pool www www 973 4.3 1.5 176784 29936 ? S Apr18 0:30 php-fpm: pool www www 991 3.1 1.5 178832 31740 ? S Apr18 0:30 php-fpm: pool www www 994 2.3 1.7 179808 34620 ? S Apr18 0:34 php-fpm: pool www www 6751 5.5 1.2 171840 24124 ? S May02 0:11 php-fpm: pool www www 6752 4.7 1.4 174180 29452 ? S May02 0:11 php-fpm: pool www www 6753 4.2 1.4 174128 29488 ? S May02 0:12 php-fpm: pool www www 6754 4.3 1.5 176176 31680 ? S May02 0:12 php-fpm: pool www www 6755 3.1 1.1 167976 23540 ? S May02 0:11 php-fpm: pool www www 10316 4.0 1.4 174112 29668 ? S May07 0:09 php-fpm: pool www
从上面可以看出,虽然每个 php-fpm: pool www 进程占用的 cpu 和内存不大,但是总共有 20 个啊,加起来 cpu 和 内存占用就很大了,难怪网站加载变慢了
解决方法
# 编辑 php-fpm.conf vi /usr/local/php/etc/php-fpm.conf
修改前
[global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /usr/local/php/var/log/php-fpm.log log_level = notice [www] listen = /tmp/php-cgi.sock listen.backlog = -1 listen.allowed_clients = 127.0.0.1 listen.owner = www listen.group = www listen.mode = 0666 user = www group = www pm = dynamic pm.max_children = 20 pm.start_servers = 10 pm.min_spare_servers = 10 pm.max_spare_servers = 20 pm.max_requests = 1024 pm.process_idle_timeout = 10s request_terminate_timeout = 100 request_slowlog_timeout = 0 slowlog = var/log/slow.log
修改后
[global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /usr/local/php/var/log/php-fpm.log log_level = notice [www] listen = /tmp/php-cgi.sock listen.backlog = -1 listen.allowed_clients = 127.0.0.1 listen.owner = www listen.group = www listen.mode = 0666 user = www group = www pm = dynamic pm.max_children = 10 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 6 pm.max_requests = 1024 pm.process_idle_timeout = 10s request_terminate_timeout = 100 request_slowlog_timeout = 0 slowlog = var/log/slow.log
对比观察,发现主要是修改以下几项的数值
pm.max_children = 10 php-fpm: pool www 最大进程数 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 6
修改好后,执行以下命令重启 php-fpm
# 重启 php-fpm systemctl restart php-fpm
或者在 crontab 中添加定时重启 php-fpm 的任务
# 查看 crontab 定时任务 crontab -l
# 在 crontab 中添加定时重启 php-fpm 任务 crontab -e # 每天凌晨 1 点重启 php-fpm 服务 0 1 * * * systemctl restart php-fpm # 添加后,保存并退出 :wq
至此,成功的解决了 php-fpm: pool www 进程过多,cpu 和 内存占用很大的问题
这个修改是个双刃剑,当你网站访问流量变大的时候,他自己会调整很多进程以解决更高并发的问题,你强行改小,确实不占用内存,但是更多用户访问的时候,就会变成无法访问。
确实,我也发现这问题了,所以我用了定时重启,谢谢提醒