apache2在centos上的性能瓶颈
导读:定位与成因概览 MPM 选型不当:在 CentOS 7 上常见默认使用 prefork(每个进程单线程)。当并发上来时,进程创建与上下文切换开销大,且占用更多内存;若应用是线程安全的(如配合 PHP-FPM),应改用 worker/eve...
定位与成因概览
- MPM 选型不当:在 CentOS 7 上常见默认使用 prefork(每个进程单线程)。当并发上来时,进程创建与上下文切换开销大,且占用更多内存;若应用是线程安全的(如配合 PHP-FPM),应改用 worker/event 以提升并发与资源利用率。
- 连接与队列瓶颈:过短的 KeepAliveTimeout 导致频繁握手;过长则占用工作进程/线程;ListenBacklog 过小会在突发流量时排队超时;Timeout 过大让慢请求长期占用连接。
- 文件描述符与端口耗尽:系统或进程级 ulimit -n 过低、内核 net.core.somaxconn 与 net.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_cache 或 CDN,放大响应时延与后端压力。
快速自检清单
- 查看 MPM 与编译参数:
httpd -V(关注 Server MPM 与是否线程化)。 - 观察连接与排队:
ss -lntp | grep :80与netstat -s | egrep "listen|syn";必要时提升 ListenBacklog 与内核 somaxconn。 - 检查文件描述符:
ulimit -n与cat /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 60、KeepAlive On、KeepAliveTimeout 5、MaxKeepAliveRequests 100~500、ListenBacklog 1024(按 CPU 与负载调优)。
- 建议:
- 静态资源传输与缓存压缩
- 启用:
EnableSendfile On、EnableMMAP On;mod_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 65535、net.ipv4.tcp_max_syn_backlog 65535、net.ipv4.tcp_tw_reuse 1、net.ipv4.tcp_fin_timeout 30、net.ipv4.ip_local_port_range 1024 65535、vm.swappiness 10。
- 提高进程/系统限制:
- 日志与模块
- 减少同步日志开销(条件日志、缓冲写入),关闭无用模块(如 mod_cgi、mod_info),仅启用必需模块。
- 协议与加速
- 启用 HTTP/2(mod_http2) 提升多路复用;静态资源上 CDN;动态层前加 mod_proxy + mod_cache/disk_cache 做反向代理缓存。
常见症状与对应措施
| 症状 | 可能瓶颈 | 快速措施 |
|---|---|---|
| 高并发下吞吐不升反降、CPU 抖动 | prefork 进程过多、上下文切换大 | 改用 event/worker;按内存估算并压测校准 MaxRequestWorkers |
| 页面加载慢、带宽占用高 | 静态资源未压缩/未缓存 | 启用 mod_deflate 与 mod_expires,设置长期缓存策略 |
| 压测早期大量失败、连接超时 | ListenBacklog 与内核 somaxconn 过小 | 提升二者并观察 ss -lntp 队列变化 |
| 短连接高并发时端口耗尽 | ip_local_port_range 过小、TIME_WAIT 占用 | 扩大端口范围,开启 tcp_tw_reuse,缩短 tcp_fin_timeout |
| 动态接口 RT 高、后端抖动 | 无缓存、直连后端 | 引入 mod_proxy + mod_cache/disk_cache 或 CDN 分层缓存 |
| 大量 TIME_WAIT、握手耗时 | KeepAlive 过短/过长、TLS 会话复用不足 | 调整 KeepAliveTimeout 5~10s;启用 HTTP/2 与 SSL 会话复用 |
安全与风险提示
- 修改 MPM 与内核参数前务必备份配置,先在测试环境验证;逐步变更并配合压测与监控。
- 调整 ulimit/内核参数 可能影响系统全局稳定性,遵循变更流程与回滚预案。
- 不建议为性能直接关闭 SELinux 或粗暴停止必要服务,应采用最小权限与策略调优替代。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: apache2在centos上的性能瓶颈
本文地址: https://pptw.com/jishu/782680.html
