2020-05-12 04:05:03
PHP-FPM CPU占用率过高可通过调整进程参数、设置空闲超时、使用Opcode缓存、优化代码、选择高效Web服务器及升级硬件等方式优化,具体如下:
调整进程参数
控制进程数量:通过修改pm.max_children(最大子进程数)和pm.start_servers(启动时创建的子进程数)参数,避免进程过多导致CPU竞争。例如,根据服务器内存和PHP请求平均内存占用计算合理值:max_children ≈ 总内存 / 单进程内存占用。
选择进程管理模式:根据场景选择static(固定进程数)、dynamic(动态调整)或ondemand(按需启动)。动态模式需合理设置pm.min_spare_servers(最小空闲进程数)和pm.max_spare_servers(最大空闲进程数),避免频繁创建/销毁进程增加CPU开销。
设置空闲超时
缩短回收时间:通过pm.process_idle_timeout参数设置子进程空闲超时时间(如30秒),超时后自动回收进程,释放CPU资源。需平衡响应速度与资源占用,避免设置过短导致频繁重启进程。
使用Opcode缓存
启用OPcache:安装并配置PHP的OPcache扩展(如zend_extension=opcache.so),缓存预编译的脚本字节码,减少重复解析和编译的开销。典型配置包括:
opcache.enable=1:启用缓存。
opcache.memory_consumption=128:分配缓存内存(MB)。
opcache.max_accelerated_files=4000:缓存脚本文件数量。
opcache.validate_timestamps=0(生产环境建议):禁用文件修改检查以提升性能(需手动重启PHP-FPM更新缓存)。
优化PHP代码
消除性能瓶颈:使用工具(如XHProf、Blackfire)分析代码执行路径,重点关注高耗时函数、数据库查询和循环逻辑。例如:
减少数据库查询次数,使用索引优化慢查询。
避免在循环中执行重复操作(如文件读写、网络请求)。
使用更高效的算法或数据结构(如用array_column替代循环提取数组字段)。
减少全局变量和静态方法:全局变量和静态方法可能增加内存占用和锁竞争,优先使用局部变量和依赖注入。
选择高效的Web服务器
Nginx+PHP-FPM组合:Nginx采用异步非阻塞模型,能高效处理高并发请求,减少PHP-FPM的请求堆积。例如,Nginx的worker_processes设置为CPU核心数,worker_connections调整为合理值(如1024)。
Apache优化:若使用Apache,建议启用event或worker MPM模式(而非prefork),并配置KeepAlive参数平衡连接复用与资源占用。
升级硬件
增加CPU核心数:多核心CPU可并行处理更多PHP-FPM进程,降低单核负载。例如,将4核升级为8核。
扩大内存容量:确保内存足够容纳所有PHP-FPM进程和OPcache。内存不足会导致频繁交换(Swap),显著增加CPU占用。
使用SSD存储:若磁盘I/O是瓶颈(如日志写入、文件缓存),升级为SSD可减少I/O等待时间,间接降低CPU占用。
其他建议: