温馨提示×

CentOS Apache内存管理

小樊
42
2025-12-17 13:10:02
栏目: 智能运维

CentOS 上 Apache 内存管理的实用指南

一 关键概念与快速评估

  • 明确 Apache 的内存占用主要来自每个 工作进程/线程 的常驻集(RSS)。估算公式:总内存 ≈ 单进程 RSS × 并发进程/线程数 + 系统与其他服务开销。先测得单进程内存,再反推并发上限,避免 OOM。
  • 查看 MPM 与编译参数:运行 httpd -V,关注 Server MPMMPM 配置文件路径(如 /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 OnMaxKeepAliveRequests 100KeepAliveTimeout 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 再推进到生产。

0