服务器负载过高排查
负载高 ≠ CPU 高。负载高可能来自 I/O 瓶颈、CPU 瓶颈、内存瓶颈或网络瓶颈。 排查本质是找到瓶颈资源的过程。
Netflix 60 秒法则
登录服务器后前 60 秒内执行标准命令序列,快速建立整体认知:
# ── 第 1~5 秒 ──
uptime # load average
dmesg -T | tail -10 # kernel errors
# ── 第 6~15 秒 ──
vmstat 1 3 # procs/memory/io/system/cpu
mpstat -P ALL 1 3 # per-CPU breakdown
# ── 第 16~25 秒 ──
pidstat -u 1 3 # per-process CPU
pidstat -d 1 3 # per-process IO
# ── 第 26~35 秒 ──
iostat -xzm 1 3 # disk IOPS & latency
free -h -w # memory pressure
# ── 第 36~45 秒 ──
sar -n DEV 1 3 # network throughput
sar -n TCP,ETCP 1 3 # TCP retransmits, listen drops
# ── 第 46~60 秒 ──
top -bn1 # process snapshot
ss -s # connection summary
判断标准:
wa高 +b列高 → I/O 瓶颈us/sy高 +r列高 → CPU 瓶颈si/so持续不为 0 → 内存不足(swap 频繁)cs高 +sy高 → 上下文切换过多
实战案例:日志 IO 打满
电商平台促销期间,24 核 / 32GB 服务器,load average 从 5~8 飙升至 42+,P99 响应从 200ms 到 3800ms。
全局扫描
┌─ uptime: 42.35, 28.17, 15.42
├─ top: wa=53.8%, id=32.1% → I/O 瓶颈
├─ vmstat: b=38, r=3 → 38 进程阻塞在 I/O
├─ free: Mem OK, Swap 3G used → 轻度内存压力
└─ 结论:I/O 瓶颈,非 CPU
定位 I/O 源头
┌─ iostat: w/s=4500, w_await=112ms, %util=98.7%
├─ iotop: Java 进程 320MB/s 写入,IO> 95.2%
├─ pidstat: Java PID=3456, 320MB/s
├─ lsof: fd→app.log(deleted) + fd→app.log.1
└─ 结论:日志双文件写入打满磁盘
根因链路
DEBUG 日志(20MB/min → 20GB/min)
→ logrotate 用 create(非 copytruncate)
→ Java 进程仍在写入旧文件 app.log.1
→ IO 翻倍 → 磁盘打满 → 进程排队 → load 飙升
恢复与修复
# 临时恢复
kill -USR1 <PID> # 日志框架重载
: > /proc/<PID>/fd/<FD_NUMBER> # 清空 deleted 文件内容
# 长期方案:logrotate copytruncate + 异步日志 + 独立分区
常见根因速查
| 根因 | 典型信号 | 排查方向 |
|---|---|---|
| 日志 IO 打满 | wa 高, iotop 显示日志进程高 IO | 检查日志级别 + logrotate 配置 |
| DB fsync 瓶颈 | wa 高, iostat 写延迟高, MySQL 进程 | innodb_flush_log_at_trx_commit=1 + sync_binlog=1 |
| TIME_WAIT 堆积 | ss -s 大量 timewait, listen drops | tcp_tw_reuse + 连接池 |
| apt-check 后台 IO | 低配服务器 wa>90%, iotop 显示 apt-check | systemctl disable apt-daily.timer |
| 内存不足 + swap | si/so > 0, free available 低 | 加内存或优化应用 |
| 上下文切换过多 | cs 高 + sy 高, vmstat | 线程池/连接池优化 |
生产排查纪律
① 不要盲目重启 — 重启清除现场,根因可能永远丢失
② 先采集数据再操作 — kill/rm/restart 前保存关键指标
③ 判断要有数据支撑 — "wa=53.8%、b=38" 而非"我觉得是 IO"
④ 灰度执行 — 多节点先验证一个,确认再推全量
⑤ 回滚方案提前准备 — 改配置前先备份
⑥ 变更记录完整 — 记入故障复盘报告
关联页面
| 页面 | 关联点 |
|---|---|
| linux-load-average-guide | Load Average 理论 + 排查五步法 |
| server-performance-four-dimensions | 五维排查总纲与决策树 |
| linux-disk-space-troubleshooting | 磁盘空间排查(lsof deleted / logrotate + 生产清理流程) |
| fullstack-performance-troubleshooting | 应用层性能排障方法论 |
| network-troubleshooting-order | 网络排障(TIME_WAIT 等) |
| linux-load-high-cpu-low-troubleshooting | Linux Load 高但 CPU 低的排查思路 — 从现象确认到根因定位的系统化诊断流程(含 vm |
| nfs-troubleshooting-sop | NFS 故障排查 SOP — 7 步排查法 / 6 类故障 / 4 大实战案例 / 生产最佳实践 |
| linux-perf-troubleshooting-handbook | Linux 服务器性能排查实战手册 — 60 秒快速摸底/4 大瓶颈排查/3 个实战案例/监控阈值/ |
| ops-automation-scripts | 运维自动化脚本 5 件套(健康巡检/日志告警/批量执行) |