温馨提示×

apache2在centos上的性能瓶颈

小樊
44
2025-12-29 06:47:30
栏目: 智能运维

定位与成因概览

  • MPM 选型不当:在 CentOS 7 上常见默认使用 prefork(每个进程单线程)。当并发上来时,进程创建与上下文切换开销大,且占用更多内存;若应用是线程安全的(如配合 PHP-FPM),应改用 worker/event 以提升并发与资源利用率。
  • 连接与队列瓶颈:过短的 KeepAliveTimeout 导致频繁握手;过长则占用工作进程/线程;ListenBacklog 过小会在突发流量时排队超时;Timeout 过大让慢请求长期占用连接。
  • 文件描述符与端口耗尽:系统或进程级 ulimit -n 过低、内核 net.core.somaxconnnet.ipv4.ip_local_port_range 过小,都会限制并发连接与短连接复用能力。
  • 静态资源未压缩与未缓存:未启用 mod_deflate(Gzip)与 mod_expires(Cache-Control/Expires),导致带宽占用高、重复传输多。
  • 日志与模块开销:同步写大访问日志、启用不必要模块(如 cgi/info)增加 CPU 与 I/O。
  • SSL/TLS 与 HTTP/1.1 开销:未启用 HTTP/2(mod_http2) 与合适的 SSL 会话复用策略,TLS 握手与队头阻塞影响吞吐。
  • 后端瓶颈与缺少缓存代理:动态请求直打后端,缺少 mod_proxy + mod_cache/disk_cacheCDN,放大响应时延与后端压力。

快速自检清单

  • 查看 MPM 与编译参数:httpd -V(关注 Server MPM 与是否线程化)。
  • 观察连接与排队:ss -lntp | grep :80netstat -s | egrep "listen|syn";必要时提升 ListenBacklog 与内核 somaxconn
  • 检查文件描述符:ulimit -ncat /proc/<httpd_pid>/limits;系统级检查 /etc/security/limits.conf
  • 打开状态页:mod_status + ExtendedStatus On,用 lynx http://localhost/server-status 观察 Busy/Idle workers、Scoreboard、Req/s
  • 基线压测:用 siege -c <并发> -t <时长> <URL> 对比优化前后 RPS、P95/P99、失败率
  • 资源监控:top/vmstat/iostat 观察 CPU steal、I/O wait、内存换页;确认瓶颈在 CPU/内存/网络/磁盘 哪一层。

针对性优化要点

  • 选择并切换 MPM
    • 线程安全场景优先 event(基于 worker,事件驱动处理空闲/KeepAlive 连接);非线程安全(如传统 mod_php)用 prefork
    • 切换步骤(CentOS 7 示例):安装目标 MPM 包(如 yum install httpd-event -y),在 /etc/httpd/conf.modules.d/00-mpm.conf 中仅启用目标 MPM 模块,重启 httpd
  • 连接与请求参数
    • 建议:Timeout 60KeepAlive OnKeepAliveTimeout 5MaxKeepAliveRequests 100~500ListenBacklog 1024(按 CPU 与负载调优)。
  • 静态资源传输与缓存压缩
    • 启用:EnableSendfile OnEnableMMAP Onmod_deflate 压缩 text/html、text/css、application/javascript 等;mod_expires 设置 Cache-Control/Expires(如图片 1 年、CSS/JS 30 天)。
  • 并发与内存边界
    • 以单进程/线程内存为基准,估算 MaxRequestWorkers:例如单进程约 30MB,可用内存 8GB,预留 2GB 给系统与其他服务,则上限约为 (8-2)/30 ≈ 200;再结合压测微调。
  • 文件描述符与内核网络
    • 提高进程/系统限制:/etc/security/limits.conf 设置 * soft/hard nofile 65535;PAM 会话加载 pam_limits.so;内核:net.core.somaxconn 65535net.ipv4.tcp_max_syn_backlog 65535net.ipv4.tcp_tw_reuse 1net.ipv4.tcp_fin_timeout 30net.ipv4.ip_local_port_range 1024 65535vm.swappiness 10
  • 日志与模块
    • 减少同步日志开销(条件日志、缓冲写入),关闭无用模块(如 mod_cgi、mod_info),仅启用必需模块。
  • 协议与加速
    • 启用 HTTP/2(mod_http2) 提升多路复用;静态资源上 CDN;动态层前加 mod_proxy + mod_cache/disk_cache 做反向代理缓存。

常见症状与对应措施

症状 可能瓶颈 快速措施
高并发下吞吐不升反降、CPU 抖动 prefork 进程过多、上下文切换大 改用 event/worker;按内存估算并压测校准 MaxRequestWorkers
页面加载慢、带宽占用高 静态资源未压缩/未缓存 启用 mod_deflatemod_expires,设置长期缓存策略
压测早期大量失败、连接超时 ListenBacklog 与内核 somaxconn 过小 提升二者并观察 ss -lntp 队列变化
短连接高并发时端口耗尽 ip_local_port_range 过小、TIME_WAIT 占用 扩大端口范围,开启 tcp_tw_reuse,缩短 tcp_fin_timeout
动态接口 RT 高、后端抖动 无缓存、直连后端 引入 mod_proxy + mod_cache/disk_cacheCDN 分层缓存
大量 TIME_WAIT、握手耗时 KeepAlive 过短/过长、TLS 会话复用不足 调整 KeepAliveTimeout 5~10s;启用 HTTP/2 与 SSL 会话复用

安全与风险提示

  • 修改 MPM 与内核参数前务必备份配置,先在测试环境验证;逐步变更并配合压测与监控。
  • 调整 ulimit/内核参数 可能影响系统全局稳定性,遵循变更流程与回滚预案。
  • 不建议为性能直接关闭 SELinux 或粗暴停止必要服务,应采用最小权限与策略调优替代。

0