Linux PHP-FPM资源占用高的排查与优化
一 快速定位占用来源
ps -fe | grep "php-fpm" | grep "pool" | wc -lps auxw | head -1; ps auxw | sort -rn -k4 | head -40ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%.0fM\n", sum/NR/1024) }'slowlog与slowlog_timeout(如2s),用grep -v "^$" /path/to/pool.slow.log | head查看。pm.status_path,用curl http://127.0.0.1/status?full查看active、idle、queue等指标。ulimit -n与cat /proc/<php-fpm-pid>/limits;必要时在/etc/security/limits.conf提高nofile。listen.backlog(如1024)以增强稳定性。二 配置层面的优化要点
max_children ≈ 可用内存 / 单个进程RSS(建议预留**20%–30%**给系统与其他服务)。8*1024/30 ≈ 273,可先设200–250并压测微调。pm.start_servers:建议设为min_spare_servers与max_spare_servers的中间值。pm.min_spare_servers / pm.max_spare_servers:保持一定空闲以应对突发,但需小于max_children。pm.max_requests(或pm.max_requests_per_child):进程处理一定请求后重启,用于缓解长期运行导致的内存膨胀;值过小会频繁重启,过大回收效果差,需结合压测取平衡。request_terminate_timeout:脚本最大执行时间,防止慢请求长期占用进程(如30s)。request_slowlog_timeout:记录慢请求,配合慢日志定位问题代码(如2s)。listen.backlog;高并发可拆分多个sock并做upstream负载均衡。三 应用与架构层面的优化
opcache.enable=1opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=4000opcache.revalidate_freq=60四 安全调整与落地步骤
ab/wrk/siege或真实流量回放,观察CPU、内存、队列、502/504变化。systemctl reload php-fpm(不中断现有请求),必要时再restart。/etc/security/limits.conf设置* soft/hard nofile 65536,并确保服务由systemd正确继承(如LimitNOFILE=)。pm = dynamicpm.max_children = 20(约占用600MB,预留余量)pm.start_servers = 6pm.min_spare_servers = 4pm.max_spare_servers = 12pm.max_requests = 2000request_terminate_timeout = 30srequest_slowlog_timeout = 2sslowlog = /var/log/php-fpm/www-slow.logrlimit_files = 65536pm = static,pm.max_children按“内存/平均RSS”估算(如200–300),减少进程调度开销。