返回首页

服务器负载过高排查 — 案例实战 / Netflix 60 秒法 / 常见根因

📅 创建于 2026-05-11 🔄 更新于 2026-09-07 📝 646 字

服务器负载过高排查

负载高 ≠ 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 件套(健康巡检/日志告警/批量执行)