服务器负载过高排查
负载高 ≠ 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 文件内容(等价 truncate -s 0,不可回滚)
长期方案:异步日志 + 独立分区 + 正确的轮转策略。 轮转策略不是无脑 copytruncate:
| 策略 | 机制 | 适用 | 代价 |
|---|---|---|---|
create + postrotate 信号 |
rename 后通知进程 reopen | 应用支持 reopen | 信号发错就不 reopen —— 本案例正是栽在这里 |
copytruncate |
先复制再截断原文件,inode 不变 | 应用不支持 reopen 时兜底 | 复制窗口内可能丢失或重复日志;复制大日志 I/O 翻倍 |
根治顺序是 reopen 机制 > copytruncate > 什么都不做。本案例的 Java 应用由 Logback/Log4j2 管理日志,正解是修好日志框架自己的轮转(或让 postrotate 发对信号),而不是默认切到 copytruncate——后者复制 20GB/min 级别的日志同样会把 IO 打满。
⚠️ 观点分歧(2026-09-02 标注): 本页早期结论(2026-05-11)把「logrotate
copytruncate」直接列为长期方案。2026-08-11 的来源指出copytruncate先复制再截断,对大日志意味着一次全量复制、I/O 翻倍,不适合高写入速率场景。完整证据链见 linux-deleted-file-disk-space-reclaim。
常见根因速查
| 根因 | 典型信号 | 排查方向 |
|---|---|---|
| 日志 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-high-sop | Load 高全场景 11 步标准流程 + 6 场景修复手册 — 本页 60 秒快速分诊后的完整处置端 |
| linux-load-average-guide | Load Average 理论 + 排查五步法 |
| server-performance-four-dimensions | 五维排查总纲与决策树 |
| linux-disk-space-troubleshooting | 磁盘空间排查(lsof deleted / logrotate + 生产清理流程) |
| linux-deleted-file-disk-space-reclaim | 幽灵文件深度排查 — 本案例「deleted FD + 日志双写」现象的完整证据链与释放手段优先级 |
| 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 个实战案例/监控阈值/ |
| system-load-high-rsyslogd-case-study | 一个 rsyslogd 被 audit 审计日志刷屏导致的系统负载高案例,涵盖 CPU 拆解、软中断 |
| ops-automation-scripts | 运维自动化脚本 5 件套(健康巡检/日志告警/批量执行) |