定位与成因概览
快速自检清单
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/内存/网络/磁盘 哪一层。针对性优化要点
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。常见症状与对应措施
| 症状 | 可能瓶颈 | 快速措施 |
|---|---|---|
| 高并发下吞吐不升反降、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 会话复用 |
安全与风险提示