CentOS 上 Apache 内存管理的实用指南
一 关键概念与快速评估
- 明确 Apache 的内存占用主要来自每个 工作进程/线程 的常驻集(RSS)。估算公式:总内存 ≈ 单进程 RSS × 并发进程/线程数 + 系统与其他服务开销。先测得单进程内存,再反推并发上限,避免 OOM。
- 查看 MPM 与编译参数:运行 httpd -V,关注 Server MPM 与 MPM 配置文件路径(如 /etc/httpd/conf.modules.d/00-mpm.conf)。不同 MPM(prefork/worker/event)的内存与并发特性差异很大。
- 快速测量单进程内存:
- ps:ps -o rss,vsz,cmd -C httpd | tail -n +2(单位 KB)
- top/htop:观察 httpd 进程的 %MEM 与 RSS
- 实时按内存排序:top -o %MEM
- 粗略估算并发上限(示例):若单进程 RSS≈50MB,系统可用内存≈1.5GB,预留系统与其他服务 500MB,则可大致设置 MaxRequestWorkers ≈ (1500−500)/50 ≈ 20,再结合压测微调。
二 MPM 选择与切换
- 选择原则
- prefork:多进程、每个进程单线程,最兼容但内存占用高;当使用 非线程安全模块(如 mod_php) 时常选。
- worker/event:多进程多线程,内存更省、并发更高;event 对长连接/KeepAlive 场景更友好,但同样要求线程安全。
- 查看与切换步骤
- 查看:httpd -V(Server MPM 与配置路径)
- 切换(以 CentOS 常见路径为例):编辑 /etc/httpd/conf.modules.d/00-mpm.conf,注释/取消注释对应 LoadModule mpm_prefork_module / mpm_worker_module / mpm_event_module 行,保存后重启。
- 与 PHP 的兼容性:若使用 event/worker,请搭配 PHP-FPM(FastCGI);若必须用 prefork,可直接用 mod_php。切换 MPM 后需一并调整 PHP 运行方式并重启相关服务。
三 核心参数调优要点
- prefork(示例)
- 关键指令:StartServers、MinSpareServers、MaxSpareServers、MaxRequestWorkers(或 MaxClients)、MaxConnectionsPerChild
- 思路:用“单进程 RSS × MaxRequestWorkers”不超过可用内存;若观察到内存增长,可设置 MaxConnectionsPerChild 为非零值,周期性回收进程以抑制泄漏影响。
- worker/event(示例)
- 关键指令:StartServers、MinSpareThreads、MaxSpareThreads、ThreadLimit、ThreadsPerChild、MaxRequestWorkers、MaxConnectionsPerChild
- 思路:并发能力≈ThreadsPerChild × 进程数;在内存与 CPU 之间平衡,必要时用 MaxConnectionsPerChild 做进程回收。
- 连接与 KeepAlive
- 建议:KeepAlive On;MaxKeepAliveRequests 100;KeepAliveTimeout 5(单位秒)。适度降低 KeepAlive 可减少长连接带来的常驻内存占用,但过小会影响性能。
- 典型示例(仅示意,需按实测调整)
- prefork:
- StartServers 5
- MinSpareServers 5
- MaxSpareServers 10
- MaxRequestWorkers 150
- MaxConnectionsPerChild 0
- worker/event:
- StartServers 2
- MinSpareThreads 25
- MaxSpareThreads 75
- ThreadLimit 64
- ThreadsPerChild 25
- MaxRequestWorkers 150
- MaxConnectionsPerChild 0
- 修改后重启:systemctl restart httpd。
四 内存不足时的应对
- 快速缓解
- 检查与扩容:free -m 查看内存与 Swap;必要时创建并启用 Swap 文件(如 4GB),编辑 /etc/fstab 持久化,缓解短期峰值压力。
- 降低占用:临时下调 MaxRequestWorkers/ThreadsPerChild;缩短 KeepAliveTimeout;开启 mod_deflate 压缩;启用 mod_cache/mod_disk_cache 缓存静态资源;仅启用必需模块;分析访问/错误日志定位异常。
- 谨慎清理缓存:echo 3 > /proc/sys/vm/drop_caches 可释放 pagecache/dentries/inodes,但可能导致 IO 飙升,仅在明确需要时执行。
- 根本优化
- 若仍紧张,考虑 增加物理内存 或迁移到 更省内存的 MPM(event + PHP-FPM);对应用层进行内存泄漏排查与 SQL/缓存优化。
五 监控与压测流程
- 持续监控
- 进程与内存:top/htop、ps -o rss,vsz,cmd -C httpd;必要时用 apachetop 观察请求分布与热点。
- 系统层面:free -m、vmstat 1、iostat -x 1 观察内存、swap、IO 与 CPU 等待。
- 变更与验证
- 每次只调整一个关键参数,变更后用 ab/wrk/siege 等工具进行压测,观察 吞吐、P95/P99 延迟、错误率与内存占用,确认无 regress 再推进到生产。