温馨提示×

如何优化Linux Apache2的内存使用

小樊
41
2025-12-22 18:09:40
栏目: 智能运维

Linux Apache2 内存优化实操指南

一 基线评估与上限计算

  • 确认 MPM 模型:执行 httpd -lapache2 -l,常见为 prefork(每个进程单线程,PHP 常用)或 worker/event(多进程多线程,适合高并发)。不同 MPM 的调参对象不同。
  • 测量单进程常驻内存:用 top/htop 观察 Apache 进程的 RES,排除异常值后取平均值(单位 MB)。
  • 设定可用内存比例:若为专用 Web 服务器,建议以内存的 90%(>4GB)80%(≤4GB) 作为 Apache 可用上限;若同机运行数据库/缓存等,需先扣除其占用后再计算。
  • 计算 MaxRequestWorkers(或 MaxClients)上限:上限 ≈(可用内存 × 1024 × 0.9 或 0.8)÷ 平均 RES。示例:内存 8GB、平均 RES 30MB,上限 ≈ 8192×0.9÷30 ≈ 245
  • 快速校验:并发连接数 ≈ KeepAliveTimeout × 每秒请求数 ÷ 平均 KeepAlive 请求数;确保“并发连接数 ≤ 上限”,否则需降低 KeepAlive 或上调内存/优化应用。

二 MPM 关键参数建议

  • prefork(适合传统 CGI/PHP,最稳):
    • 目标:控制“进程数 × 单进程 RES”不超过内存上限。
    • 建议:适度降低 MaxRequestWorkers;将 MaxConnectionsPerChild 设为非零(如 1000–10000)以周期性回收泄漏增长;KeepAliveTimeout 建议 3–5 秒StartServers/MinSpareServers/MaxSpareServers 不宜过大,避免空闲进程堆积。
  • worker/event(高并发、低内存占用):
    • 目标:控制“进程数 × 线程数 × 单线程 RES”不超过内存上限。
    • 建议:合理设置 ThreadsPerChildMaxRequestWorkersMaxConnectionsPerChild 同样建议非零;KeepAliveTimeout3–5 秒StartServers/MinSpareThreads/MaxSpareThreads 适中即可。
  • 切换 MPM(Debian/Ubuntu 常用 a2enmod/a2dismod;RHEL/CentOS 编辑相应配置并重启):
    • Ubuntu/Debian:a2dismod mpm_prefork && a2enmod mpm_event && systemctl restart apache2
    • RHEL/CentOS:编辑 /etc/httpd/conf.modules.d/00-mpm.conf 启用 worker/event,注释 prefork,重启 httpd。

三 连接与会话优化

  • KeepAlive:开启可复用连接、降低握手开销,但会占用连接槽位;建议 KeepAlive OnKeepAliveTimeout 3–5 秒MaxKeepAliveRequests 50–100,在“并发连接数”与“内存占用”间取平衡。
  • 压缩与缓存:启用 mod_deflate 压缩文本类资源(HTML/CSS/JS),启用 mod_expires 设置长过期时间,启用 mod_cache/mod_disk_cache 缓存静态或可缓存内容,降低后端与带宽压力。
  • 静态文件传输:启用 sendfile(通常默认开启),减少用户态/内核态拷贝,提高静态资源吞吐。
  • 关闭 DNS 反向解析:将 HostnameLookups Off,避免每条日志解析域名造成延迟与负载。

四 模块精简与内核网络调优

  • 精简模块:仅保留必要模块(如 mod_deflate、mod_expires、mod_cache 等),用 a2dismod 禁用不需要的模块,减少常驻内存与攻击面。
  • 内核与虚拟内存:适度降低 vm.swappiness(如 10–30)以减少换页;必要时调整 vm.overcommit_memory(如 2 更保守);根据负载选择是否启用/禁用 透明大页(THP);仅在测试或排障时清理缓存(如 /proc/sys/vm/drop_caches),不建议生产频繁使用。
  • 监控与压测:持续用 top/htop/apachetop 观察 RES、连接与负载;用 abwrk 做基线压测,验证“并发/延迟/内存”三者平衡后再上线。

五 快速配置示例

  • prefork(示例为 4GB 内存、平均 RES 约 30MB,按 80% 可用):上限 ≈ 4096×0.8÷30 ≈ 109,保守取 90
    <IfModule mpm_prefork_module>
        StartServers            5
        MinSpareServers         5
        MaxSpareServers        10
        MaxRequestWorkers      90
        MaxConnectionsPerChild 1000
    </IfModule>
    KeepAlive On
    KeepAliveTimeout 5
    MaxKeepAliveRequests 75
    HostnameLookups Off
    
  • event(示例为 8GB 内存、平均 RES 约 25MB,按 90% 可用):上限 ≈ 8192×0.9÷25 ≈ 295,保守取 256
    <IfModule mpm_event_module>
        StartServers             2
        MinSpareThreads         25
        MaxSpareThreads         75
        ThreadLimit             64
        ThreadsPerChild         25
        MaxRequestWorkers      256
        MaxConnectionsPerChild 1000
    </IfModule>
    KeepAlive On
    KeepAliveTimeout 5
    MaxKeepAliveRequests 75
    HostnameLookups Off
    
  • 应用与生效:启用所需模块(如 a2enmod deflate expires cache disk_cache),检查语法 apache2ctl configtest,平滑重启 systemctl reload apache2;随后压测并微调 MaxRequestWorkers/KeepAliveTimeout 至稳定区间。

0