温馨提示×

如何调整Apache在Ubuntu上的内存使用

小樊
39
2026-01-03 14:26:02
栏目: 智能运维

在 Ubuntu 上调整 Apache 内存使用的实用步骤

一 先确认 MPM 与单进程内存

  • 查看当前 MPM 模块:
    • apache2 -V | grep -i mpm
  • 估算单个 Apache 子进程的平均内存(RSS,单位 MB):
    • ps -U www-data -u www-data u | awk ‘{S+=$6} END {print int(S/NR)}’
    • 说明:RSS 包含共享库,估算“每个进程独占内存”时可用 RSS 的一半作为保守值(经验做法)。
  • 计算 MaxRequestWorkers(旧称 MaxClients)上限:
    • MaxRequestWorkers ≈ (总物理内存 − 系统与其他服务预留) ÷ 单进程独占内存
    • 示例:总内存 1024MB,预留 512MB,单进程独占 4MB,则 MaxRequestWorkers ≈ 128

二 核心配置与推荐起点

  • 编辑 MPM 配置(路径因发行版与 MPM 而异,常见为 /etc/apache2/mods-available/mpm_*.conf 或通过 a2enmod/a2dismod 切换 MPM)。以下为保守起点,按上节计算结果微调:
    • prefork(进程模型,最通用)
      <IfModule mpm_prefork_module>
          StartServers            5
          MinSpareServers         5
          MaxSpareServers        10
          MaxRequestWorkers     128   # 依据“内存÷单进程内存”计算
          MaxConnectionsPerChild 1000 # 非0可在长时间运行后回收内存,0为不回收
      </IfModule>
      
    • event(事件模型,高并发/长连接更友好)
      <IfModule mpm_event_module>
          StartServers             2
          MinSpareThreads        25
          MaxSpareThreads        75
          ThreadLimit             64
          ThreadsPerChild         25
          MaxRequestWorkers     150
          MaxConnectionsPerChild 1000
      </IfModule>
      
  • 连接与 KeepAlive(在通用配置段或对应 MPM 段设置)
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 2
    
    • 建议:保持 KeepAlive 开启以提升静态资源与复用连接效率,但将 KeepAliveTimeout 调小(如 2 秒)以更快释放进程/线程占用。
  • 精简模块(减少常驻内存)
    • 仅保留必需模块,例如:a2dismod autoindex status cgi …;按需启用:a2enmod expires deflate headers rewrite。

三 应用与验证

  • 语法检查与重启:
    • sudo apache2ctl configtest && sudo systemctl restart apache2
  • 观察与压测:
    • 实时监控:top/htop、apachetop;连接数:netstat -ant | grep :80 | wc -l
    • 基准测试(示例):ab -n 1000 -c 100 -k http://your-site/
    • 每次调参后重复测试,观察 内存占用、请求耗时、错误率 的变化,逐步收敛到稳定配置。

四 进阶与常见陷阱

  • 长时运行后内存“只增不减”:为 prefork 设置非零 MaxConnectionsPerChild(如 1000 起步),定期回收进程以释放累积内存;event/worker 同样可用该指令回收线程栈。
  • 动态内容(如 PHP)内存:若单脚本占用高,优先优化应用与查询;必要时降低 MaxRequestWorkers,避免 OOM 与频繁换页。
  • 静态资源减负:启用 mod_expires(设置资源过期)、mod_deflate(压缩传输),减少并发与带宽压力,从而间接降低内存与连接占用。
  • 谨慎使用“清理缓存”与内核参数:echo 1/2/3 > /proc/sys/vm/drop_caches 仅用于临时排查,不作为日常优化;内核参数(如 vm.swappiness)调整需充分测试,避免副作用。

0