2020-11-10 07:04:36
PHP-FPM进程CPU占用率过高可通过调整进程数量、优化超时设置、启用Opcode缓存、优化代码、选择高效Web服务器及升级硬件资源等方式进行优化。具体优化策略如下:
调整PHP-FPM进程数量:
pm.max_children和pm.start_servers参数控制PHP-FPM进程数。不合理的设置会导致CPU资源过度消耗。
根据服务器配置(如8核16G内存)和访问量调整参数:访问量大时,可适当增加pm.max_children,但需确保不超过服务器承载能力(如每个进程约30MB内存时,pm.max_children可设为16G/(30MB*8)≈66,实际需结合负载测试)。
动态模式(pm=dynamic)下,pm.start_servers建议设为pm.min_spare_servers和pm.max_spare_servers的中间值,避免频繁创建/销毁进程。
优化进程空闲超时设置:
pm.process_idle_timeout参数控制PHP-FPM子进程空闲时间后回收。默认值(如30s)在低负载时可能导致空闲进程堆积。
低负载场景下,可减小该参数值(如10s),加快空闲进程回收,减少CPU资源占用。
使用Opcode缓存:
启用OPcache等Opcode缓存工具,缓存PHP脚本编译结果,减少重复编译开销。
配置示例:opcache.enable=1,opcache.memory_consumption=128(根据内存调整),opcache.revalidate_freq=60(缓存更新频率)。
启用后,PHP解释器运行时间显著降低,CPU占用率可下降20%-50%。
优化PHP代码:
使用Xdebug、Blackfire等工具分析性能瓶颈,重点优化:
循环:减少嵌套循环,使用数组函数(如array_map)替代手动循环。
数据库查询:避免N+1查询,使用Eloquent的with()预加载或原生SQL优化。
缓存:对频繁访问的数据(如配置、API响应)使用Redis或Memcached缓存。
示例:将未优化的循环查询改为批量查询后,CPU占用率可降低30%。
选择高效的Web服务器:
Nginx在静态文件处理和反向代理方面性能优于Apache,可减少PHP-FPM负载。
配置Nginx时,启用gzip_static压缩静态资源,使用proxy_pass将动态请求转发至PHP-FPM,避免阻塞。
提升服务器硬件资源:
若优化后仍无法满足需求,可升级硬件:
CPU:增加核心数(如从8核升至16核),提升并行处理能力。
内存:扩大内存(如从16G升至32G),支持更多PHP-FPM进程。
云服务器场景下,可考虑垂直扩展(升级实例规格)或水平扩展(负载均衡+多台服务器)。
实施建议:
通过以上策略,可显著降低PHP-FPM的CPU占用率,提升系统整体性能。