首先需要明确内存占用高的具体原因,常用命令:
top(按M键按内存排序)或ps -ylC php-fpm --sort:rss(按RSS内存排序),确认php-fpm进程是否为内存消耗主力;ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }',了解单个进程的平均内存占用(如1GB内存服务器中,若平均每个进程占60M,则pm.max_children不宜超过15);/var/log/php-fpm/www-slow.log),定位执行时间过长的脚本(如数据库查询慢、代码逻辑问题),这些问题会导致进程长时间占用内存。根据服务器内存和CPU核心数调整/etc/php/{version}/fpm/pool.d/www.conf中的进程管理参数:
pm模式选择:
ondemand(按需创建进程,闲置时自动回收)或dynamic(动态调整进程数);static(固定进程数,减少进程创建/销毁的开销)。pm.max_children:最大子进程数,计算公式为服务器内存(MB)× 0.7 / 单个进程平均内存(MB)(如1GB内存、平均进程60M,则设置为1024×0.7/60≈12),避免过多进程占满内存;pm.start_servers:启动时的进程数,建议设置为CPU核心数×2(如4核CPU设置为8);pm.min_spare_servers/pm.max_spare_servers:空闲进程的最小/最大数量,建议设置为CPU核心数×1~CPU核心数×2(如4核CPU设置为4~8),避免频繁创建/销毁进程;pm.max_requests:单个进程处理的最大请求数(如500~1000),达到后自动重启进程,释放内存(解决内存泄漏或未释放问题)。OPcache可缓存编译后的PHP脚本,减少重复编译的内存消耗,显著提升性能:
php.ini(/etc/php/{version}/fpm/php.ini)中opcache.enable=1(开启);opcache.memory_consumption:缓存大小(如128M,根据服务器内存调整);opcache.interned_strings_buffer:字符串缓存(如32M);opcache.max_accelerated_files:缓存的脚本文件数量(如10000);opcache.validate_timestamps:生产环境设置为0(关闭文件时间戳验证,减少IO开销)。禁用未使用的PHP扩展,减少内存占用:
php.ini(/etc/php/{version}/fpm/php.ini),注释掉不需要的扩展(如xdebug、gd(若未使用图片处理)),例如:;zend_extension=xdebug.so
;extension=gd.so
sudo systemctl restart php{version}-fpm(如php7.4-fpm)。若系统存在大量缓存占用,可调整内核参数加快缓存回收:
grep -E "low|high" /proc/zoneinfo,计算low值的3倍(单位为页,1页=4KB),即为系统内存临界值;sudo sysctl -w vm.min_free_kbytes=524200(设置为512M,防止系统内存耗尽);sudo sysctl -w vm.vfs_cache_pressure=130(默认100,值越大回收越快,建议设置为100~200)。新版本PHP通常包含性能优化和内存管理改进(如PHP 8.x比PHP 7.x内存占用更低、执行更快),建议升级到最新的稳定版本(如PHP 8.3):
apt升级:sudo apt update && sudo apt install php{version}-fpm(如php8.3-fpm);sudo systemctl restart php{version}-fpm。使用工具定期监控内存使用情况,及时发现问题:
htop(按M键按内存排序)、glances(sudo apt install glances,按m键查看内存);/var/log/php-fpm/error.log)和慢日志,定位内存泄漏或性能瓶颈;