温馨提示×

如何在Ubuntu上优化Apache2的CPU使用

小樊
33
2025-12-07 02:28:04
栏目: 智能运维

Ubuntu 上优化 Apache2 的 CPU 使用

一 基线检查与模块精简

  • 确认版本与运行状态:apache2 -vsystemctl status apache2,确保为稳定版本并运行正常。
  • 精简加载模块:仅启用必需模块,减少 CPU 与内存开销。
    列出模块:apache2ctl -M;禁用不需要的模块:sudo a2dismod module_name;启用必要模块:sudo a2enmod module_name
  • 关闭 DNS 反向查询:在全局或虚拟主机中将 HostnameLookups Off,避免每个请求做 DNS 查询。
  • 减少日志压力:非必要时降低日志级别或关闭访问日志;使用 logrotate 管理日志轮转,避免频繁 I/O 放大 CPU 占用。
  • 启用压缩:启用 mod_deflate 压缩文本类响应(HTML/CSS/JS),以 CPU 换带宽,通常能显著降低总体 CPU 与网络时间:sudo a2enmod deflate
  • 启用缓存:启用 mod_cachemod_cache_disk 缓存静态资源,减少后端渲染与重复计算:sudo a2enmod cachesudo a2enmod cache_disk
  • 可选状态页:启用 mod_status 并限制来源 IP,便于排查高 CPU 时段与热点请求:ExtendedStatus On 并在 <Location /server-status> 中设置访问控制。

二 选择并调优 MPM(多处理模块)

  • 模块选择原则:
    • event:事件驱动,适合高并发、长连接场景,通常 CPU 与内存效率最佳。
    • worker:多线程,性能优于 prefork,适合线程安全环境。
    • prefork:非线程、进程隔离,兼容老旧或线程不安全模块(如某些 mod_php 场景),但内存占用更高。
  • 切换示例(Ubuntu 22.04+):
    • 查看与切换:sudo a2dismod mpm_preforksudo a2enmod mpm_event(或 mpm_worker)→ sudo systemctl restart apache2
  • 关键参数调优思路:
    • 目标是让 MaxRequestWorkers 对应的总内存占用不超过物理内存的 70%,避免 swap(swap 会显著放大 CPU 等待)。
    • 估算方法:先测量单个 Apache 子进程/线程的常驻内存(如 pmap/smem),再设置 MaxRequestWorkers,使“单进程内存 × MaxRequestWorkers ≤ 可用内存 × 0.7”。
    • 示例(Event,需结合实际压测微调):
      <IfModule mpm_event_module>
          StartServers          4
          MinSpareThreads      25
          MaxSpareThreads      75
          ThreadsPerChild      25
          MaxRequestWorkers    150
          MaxConnectionsPerChild 1000
      </IfModule>
      
    • 若使用 prefork(每个进程单线程),重点调 MaxRequestWorkers(旧称 MaxClients),并确保不超过内存上限。

三 连接与会话层优化

  • 启用并收紧持久连接(KeepAlive):
    • KeepAlive On 减少 TCP/SSL 握手与进程/线程创建销毁次数。
    • MaxKeepAliveRequests 100 限制单连接请求数,避免长连接被少数客户端长期占用。
    • KeepAliveTimeout 2(繁忙站点建议 1–5 秒)降低空闲占用;过小会影响页面内多资源加载。
  • 超时收敛:将 Timeout 5–10 秒,减少慢客户端或异常连接对 worker/线程的长时间占用。
  • 协议与加密:启用 HTTP/2(在 ports.conf 的 443 监听上添加 http2),多路复用可显著减少连接开销;确保 TLS 配置合理,避免过高加密套件导致 CPU 飙升。

四 缓存与内容层面优化

  • 页面与静态资源缓存:启用 mod_expires 设置过期头,配合浏览器与 CDN 缓存,降低后端与 CPU 计算:
    <IfModule mod_expires.c>
      ExpiresActive On
      ExpiresByType image/jpg  "access plus 1 month"
      ExpiresByType text/css   "access plus 1 week"
      ExpiresByType application/javascript "access plus 1 week"
    </IfModule>
    
  • 反向代理/静态资源卸载:将静态资源交由 Nginx/CDN,动态请求再回源 Apache,显著降低 Apache CPU 与 I/O。
  • 内容压缩:对 text/html、text/css、application/javascript 启用 mod_deflate,以可控的 CPU 开销换取更少的传输字节与更快的完成时间。
  • 数据库与应用层:优化 SQL 查询、合理使用缓存(如 OPcache)、减少阻塞与慢请求,避免后端成为 CPU 瓶颈。

五 监控与迭代流程

  • 实时监控:使用 top/htopapache2ctl statuscurl -w 观察 CPU%、负载、请求耗时、并发连接;必要时开启 mod_statusExtendedStatus 做细粒度排查。
  • 压测与验证:使用 abwrkjmeter 在测试环境进行基线压测,逐步调整 MPM 参数、KeepAlive、缓存策略,观察 吞吐、P95/P99 延迟与 CPU 变化。
  • 变更与回滚:每次只调整一个变量,变更后用 sudo systemctl reload apache2(或重启)生效,异常及时回滚。
  • 典型症状与对策:
    • 错误日志出现 “server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting” 表示并发不足,但务必先确认内存是否充足再上调。
    • 若 CPU 高而内存宽裕,优先增加 MaxRequestWorkers/ThreadsPerChild 并收紧 KeepAliveTimeout;若内存紧张,先降并发、启用缓存/CDN、优化应用与 SQL。

0