Ubuntu LNMP 内存不足的排查与优化
一 快速缓解与应急
sudo fallocate -l 1G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile;如需开机自启,执行:echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab。编译完成或不再需要时,可关闭并删除:sudo swapoff /swapfile && sudo rm /swapfile。注意:Swap 仅缓解“编译/突发”场景,会显著增加磁盘 I/O,不作为长期性能方案。memory_limit 从默认 128M/256M 临时下调到 64M–128M(仅对当前需求允许的情况下);Nginx 保持 worker_processes auto; 与适度的 worker_connections;MySQL 在内存紧张时临时降低 innodb_buffer_pool_size(如从 1G 调至 512M),并关闭不必要的缓存/日志(如 query_cache_size=0)。这些调整能快速释放内存,但可能带来性能下降,需结合业务验证。二 组件级优化要点
memory_limit(如 128M–256M 起步,视应用而定),避免全局过大;启用 OPcache 提升性能并减少重复解析开销:[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
worker_processes auto;worker_connections 1024;(结合 ulimit -n 提升文件描述符上限)epoll(Linux 默认高效);按需开启压缩、缓存静态资源,减少后端 PHP 压力。query_cache_size=0,避免锁争用与额外内存占用。tmp_table_size 与 max_heap_table_size 设为 64M–128M 起步,避免大查询撑爆内存。三 PHP-FPM 进程与内存预算
pm.max_children):max_children ≈ 可用内存 / 单个 PHP-FPM 进程峰值内存。经验上每个 PHP-FPM 进程约 20MB(取决于框架、扩展与业务代码)。pm.max_children ≈ 25–30(如设 25);pm.start_servers=5;pm.min_spare_servers=5;pm.max_spare_servers=10;request_terminate_timeout=300(避免慢脚本长期占用)。pm.max_children ≈ 45–50(如设 45);其余同上。pm.max_requests(如 500–1000)定期回收进程,降低内存碎片与泄漏风险;同时限制脚本执行时间 max_execution_time,防止异常脚本耗尽内存。四 监控定位与长期治理
free -m、top/htop、vmstat 1、iostat -x 1 观察可用内存、Swap、I/O 与 CPU 等待。unset() 释放不再使用的变量与关闭资源。