使用top(按P键按CPU排序、按M键按内存排序)、htop(更直观的进程监控)或ps aux --sort=-%cpu | head -n 10命令,查看PHP-FPM进程的CPU、内存占用情况。若某进程长期占用CPU超过80%或内存占用过高(如单个进程超过500MB),可能是代码逻辑问题或进程配置不当。
通过PHP-FPM内置命令php-fpm -t测试配置文件语法是否正确;使用systemctl status php-fpm(systemd管理)或service php-fpm status查看服务运行状态;若启用了状态页(需在配置文件中设置pm.status_path = /status),可通过curl http://localhost/status(需替换为实际路径)获取进程池的实时指标(如活跃进程数、闲置进程数、请求处理时间),判断pm.max_children(最大子进程数)是否过小(导致请求排队)或过大(耗尽内存)。
在PHP-FPM配置文件(如/etc/php/{version}/fpm/pool.d/www.conf)中开启慢日志:
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s # 超过5秒的请求记录
重启PHP-FPM服务(systemctl restart php-fpm)后,使用tail -f /var/log/php-fpm/slow.log实时查看慢日志,或用awk分析高频慢请求(如awk '{print $1, $NF}' /var/log/php-fpm/slow.log | sort | uniq -c | sort -nr统计IP或URL的请求次数与耗时)。通过慢日志定位到具体脚本或函数(如某接口执行时间过长),针对性优化代码(如减少循环嵌套、优化SQL查询)。
重点调整以下核心参数(位于www.conf中):
pm.max_children:根据服务器内存计算(如每个PHP-FPM进程占用200MB内存,8G服务器可设置为8000/200=40),避免过大导致内存耗尽;pm.start_servers:启动时的子进程数(建议为pm.max_children的1/4~1/2);pm.min_spare_servers/pm.max_spare_servers:闲置进程的最小/最大数量(避免频繁创建/销毁进程,建议设置为pm.max_children的10%~20%和30%~40%);pm.max_requests:单个进程处理的最大请求数(如1000,避免内存泄漏累积)。php.ini中开启zend_extension=xdebug.so,设置xdebug.mode=profile),生成性能分析文件(如cachegrind.out.*),用KCacheGrind或Webgrind可视化分析,查看函数调用栈、执行时间及占比,定位热点函数(如某函数占用80%时间);strace -p <PID> -T -tt),查看进程是否在等待I/O(如数据库查询慢)或进行无效操作(如频繁打开文件)。mysqladmin processlist(MySQL)或pg_stat_activity(PostgreSQL)查看当前数据库连接和查询状态,优化慢查询(如添加索引、减少SELECT *);iostat -x 1(需安装sysstat)查看磁盘读写延迟(await值),若延迟过高(如超过100ms),可能是磁盘性能瓶颈(如机械硬盘),建议升级为SSD。ngx_http_stub_status_module模块的状态(如curl http://localhost/nginx_status),查看PHP-FPM的请求队列长度(Active connections中的waiting值,若过高可能是PHP-FPM处理能力不足);若使用Apache,检查mod_status模块;iftop或nload查看网络流量,确认是否因带宽不足导致请求延迟(如上传/下载大文件时带宽占用过高)。