Skip to content

生产故障深度排查:CPU Load 与时间偏移疑难案例

两个看似无关、实则同源的经典生产疑难场景。覆盖 Linux 内核调度、时钟源、D 状态进程、NMI watchdog 等底层原理,配套可直接执行的排查命令和解决方案。


场景一:CPU 使用率低、CPU Load 高

1.1 问题现象

监控显示:
  - CPU 使用率(user + sys):仅 10%-20%
  - CPU Load Average:持续 > CPU 核数(如 8 核机器 load 达到 30-50)
  - top 中看不到高 CPU 的进程
  - 应用响应变慢,偶发超时

1.2 核心原理:Load Average 的真实含义

很多人误解 Load Average = CPU 繁忙程度,这是错误的。

Load Average 的真实定义(Linux 特有):
  = 正在运行的进程数(R 状态)
  + 等待运行的进程数(runnable)
  + 处于不可中断睡眠的进程数(D 状态)  ← 这是关键!

Linux 的 Load Average 与 Unix 的区别:
  - 传统 Unix:只计算 R + runnable
  - Linux:额外计算 D 状态(TASK_UNINTERRUPTIBLE)
  
  所以 Linux 的 Load Average 高 ≠ CPU 忙
  Linux Load 高 = 有进程在等待(CPU 或 I/O)

D 状态进程(TASK_UNINTERRUPTIBLE):

D 状态的特征:
  - 进程不可被信号中断(连 kill -9 都杀不掉)
  - 通常是等待内核锁(如磁盘 I/O、NFS、semaphore)
  - 贡献到 Load Average,但不消耗 CPU
  - 大量 D 状态进程 = Load 高 + CPU 使用率低

常见产生 D 状态的场景:
  1. NFS 服务端无响应(mount 点卡死)
  2. 磁盘 I/O 超时(坏盘、RAID 降级、存储链路抖动)
  3. 文件系统元数据操作阻塞(大目录 ls、inode 耗尽)
  4. 内核锁竞争(mm_sem、i_mutex)
  5. FUSE 文件系统卡死
  6. iSCSI/FC 存储链路中断

1.3 系统化排查步骤

bash
# === 第一步:确认 D 状态进程数量 ===
ps aux | awk '$8 ~ /D/' | wc -l
# 或者更精确:
ps -eo state,pid,cmd | grep '^D'

# === 第二步:查看 D 状态进程在等什么 ===
ps aux | awk '$8 ~ /D/'
# 关注 WCHAN 列(等待的内核函数)
# 常见 WCHAN:
#   - nfs_wait_bit_killable  → NFS 卡死
#   - io_schedule            → 磁盘 I/O 等待
#   - rpc_wait_bit_killable  → RPC 调用卡死
#   - wait_on_page_bit       → 页面缓存 I/O

# === 第三步:查看每个 D 进程的调用栈 ===
for pid in $(ps -eo state,pid | awk '$1=="D"{print $2}'); do
  echo "=== PID $pid ==="
  cat /proc/$pid/stack 2>/dev/null | head -5
  cat /proc/$pid/wchan 2>/dev/null
  echo
done

# === 第四步:检查 I/O 状况 ===
iostat -x 1 5        # 查看 %util、await、r_await、w_await
# %util > 95% → 磁盘饱和
# await > 100ms → I/O 延迟异常
# r_await 高 → 读 I/O 阻塞(可能是 NFS)

# === 第五步:检查 NFS 挂载点 ===
mount | grep nfs
# 尝试访问每个 NFS 挂载点(可能卡死):
timeout 3 ls /mnt/nfs-share 2>&1
# 如果卡住 → 该 NFS 服务端无响应

# === 第六步:查看内核日志 ===
dmesg -T | tail -50
# 关注:
#   - "task xxx blocked for more than 120 seconds"
#   - "hung_task" 警告
#   - "nfs: server xxx not responding"
#   - "I/O error" / "medium error"
#   - "EXT4-fs error" / "XFS error"

# === 第七步:检查中断和软中断 ===
cat /proc/interrupts | head -20
watch -n 1 cat /proc/interrupts   # 观察中断增量
# 如果某个中断(如 eth0)不增长 → 网卡/驱动问题

1.4 解决方案(按根因分类)

根因 A:NFS 挂载点卡死

bash
# 紧急恢复:强制卸载卡死的 NFS
umount -f -l /mnt/nfs-share   # -l = lazy umount,立即从 namespace 中移除

# 长期方案:挂载时加 timeout 参数
# /etc/fstab 示例:
# nfs-server:/share /mnt/nfs nfs defaults,soft,timeo=30,retrans=2,tcp 0 0
# 
# 参数解释:
#   soft    → I/O 超时后返回错误(而非无限等待)
#   timeo=30 → 超时时间 3 秒(单位 0.1 秒)
#   retrans=2 → 最多重试 2 次
#
# ⚠️ 注意:soft 模式可能导致应用收到 I/O 错误,需要应用层处理
# 生产推荐:hard + intr + timeo=60(hard 保证数据一致,intr 允许信号中断)

# 监控 NFS 响应时间
nfsstat -c    # 客户端统计
nfsiostat 1 5 # 每秒刷新

根因 B:磁盘 I/O 饱和

bash
# 诊断:
iostat -xz 1
# 关注:%util(利用率)、await(平均延迟)、avgqu-sz(队列深度)

# 找出 I/O 最大的进程:
iotop -oP           # 只显示有 I/O 的进程
# 或:
pidstat -d 1 5      # 每进程的 I/O 统计

# 解决:
# 1. 升级磁盘(HDD → SSD/NVMe)
# 2. 分离 I/O 密集型应用到独立磁盘
# 3. 调整 I/O 调度器:
echo mq-deadline > /sys/block/sda/queue/scheduler
# 4. 调整内核参数:
sysctl -w vm.dirty_ratio=10        # 脏页占内存比例上限
sysctl -w vm.dirty_background_ratio=5  # 后台刷脏页阈值

根因 C:内核锁竞争 / 文件系统元数据阻塞

bash
# 查看系统级 hung task:
cat /proc/sys/kernel/hung_task_timeout_secs   # 默认 120 秒
# 调整检测阈值(更早发现):
echo 30 > /proc/sys/kernel/hung_task_timeout_secs
echo 1 > /proc/sys/kernel/hung_task_panic     # 生产慎用,会 panic

# 查看锁竞争:
perf lock record -a sleep 10
perf lock report

# 文件系统层面:
# 大目录操作(如 ls 百万文件)会导致长时间 D 状态
# 解决:使用 find -maxdepth 1 分批处理,或改用 B-tree 型文件系统(XFS)

1.5 真实生产案例

案例:某 RKE2 集群 worker 节点(32 核 128G)

现象:
  - CPU 使用率 12%,Load Average 持续 80+
  - 大量 Pod 健康检查超时
  - 应用响应延迟 5-10 秒

排查过程:
  1. ps aux | awk '$8~/D/' → 发现 60+ 个 D 状态进程
  2. cat /proc/`<pid>`/stack → 全部卡在 nfs_wait_bit_killable
  3. mount | grep nfs → 发现 /data 是 NFS 挂载
  4. timeout 3 ls /data → 卡死超时
  5. NFS 服务端日志:存储后端磁盘故障,I/O 延迟 > 30 秒

根因:NFS 后端存储磁盘故障,所有访问 /data 的进程进入 D 状态

修复:
  1. 紧急:umount -l /data(lazy umount 立即恢复进程)
  2. 短期:修复 NFS 后端磁盘
  3. 长期:改用 Ceph RBD(分布式存储,无单点故障)

场景二:CPU 低、Load 低、但时间偏移 >3 分钟 + 监控断点 + 堡垒机登录失败

2.1 问题现象

这是一组极具迷惑性的症状组合:

监控显示(监控本身也有断点!):
  - CPU 使用率:正常(10%-30%)
  - CPU Load:正常(< CPU 核数)
  - 内存使用率:正常
  - 磁盘 I/O:正常
  - 网络流量:正常

但伴随症状:
  ❌ 时间同步偏移 > 3 分钟(chrony/ntpd 报警)
  ❌ 监控数据出现间隔缺失(Prometheus 采集断点)
  ❌ 堡垒机 SSH 登录失败(超时或被拒绝)
  ❌ 应用偶尔出现超时
  ❌ dmesg 中出现 "NMI watchdog" 或 "clocksource" 相关告警

关键特征:所有症状同时出现,且监控数据本身也有断点

2.2 核心原理:这不是普通问题,是内核级故障

这组症状指向一个共同的根因:

┌───────────────────────────────────────────────────────────┐
│                  CPU 核心硬锁定(Hard Lockup)              │
│                   或 TSC 时钟源不稳定                       │
├───────────────────────────────────────────────────────────┤
│                                                           │
│  CPU 某个核心被"卡住",无法响应中断和调度                    │
│                                                           │
│  表现:                                                   │
│  ┌─────────────────────────────────────────────────────┐  │
│  │ 1. 时间偏移:CPU 内部时钟计数器(TSC)不稳定        │  │
│  │    → 内核切换到 HPET/acpi_pm → 精度下降 → 时间漂移  │  │
│  │                                                     │  │
│  │ 2. 监控断点:监控 Agent 运行在卡住的 CPU 核心上     │  │
│  │    → Agent 无法被调度 → 无法上报指标 → 数据缺失     │  │
│  │                                                     │  │
│  │ 3. SSH 登录失败:sshd 进程或认证模块被调度到        │  │
│  │    卡住的核心 → 无法响应 → 登录超时                 │  │
│  │                                                     │  │
│  │ 4. CPU 使用率/Load 正常:                           │  │
│  │    因为只有 1-2 个核心卡住,其他核心正常工作        │  │
│  │    top 显示的是全局平均值,掩盖了单核问题           │  │
│  └─────────────────────────────────────────────────────┘  │
└───────────────────────────────────────────────────────────┘

TSC(Time Stamp Counter)与时钟源:

Linux 时钟源层级:
  1. TSC(Time Stamp Counter)
     - CPU 内部硬件计数器,每个时钟周期递增
     - 精度最高(纳秒级),性能最好
     - 问题:不同 CPU 核心的 TSC 可能不同步(SMP TSC drift)
     - 问题:CPU 变频/休眠时 TSC 可能停止或跳变
     - 问题:虚拟机中 TSC 可能被 hypervisor 错误处理

  2. HPET(High Precision Event Timer)
     - 主板上的硬件定时器
     - 精度较高(微秒级),但有访问延迟

  3. acpi_pm
     - ACPI 电源管理定时器
     - 精度一般,但最稳定

  4. jiffies
     - 内核软件定时器
     - 精度最低(毫秒级),最后手段

当 TSC 被检测到不稳定时:
  内核自动切换时钟源:TSC → HPET 或 acpi_pm
  切换瞬间 → 时间跳变(可能偏移数秒到数分钟)
  新时钟源精度低 → 时间逐渐漂移
  NTP/chrony 尝试修正 → 但修正速度跟不上漂移速度

NMI Watchdog 与 Hard Lockup:

NMI Watchdog 机制:
  - 每个 CPU 核心有一个 NMI(不可屏蔽中断)看门狗
  - 定期检查:该核心是否在 10 秒内响应了中断?
  - 如果超过 watchdog_thresh(默认 10 秒)无响应:
    → 记录 "watchdog: BUG: soft lockup - CPU#X stuck for Ys!"
    → 或 "watchdog: Watchdog detected hard LOCKUP on cpu X"

Soft Lockup vs Hard Lockup:
  Soft Lockup:
    - CPU 核心在执行内核代码,但无法调度其他进程
    - 通常是内核代码 bug(如死循环、锁竞争)
    - 中断可以响应

  Hard Lockup:
    - CPU 核心完全无响应(连中断都不响应)
    - 通常是硬件问题(CPU 故障、BIOS bug、电源问题)
    - 中断也无法响应
    - 更严重,通常需要重启

为什么 CPU 使用率和 Load 看不出来?
  - Hard Lockup 只影响 1-2 个核心
  - 其他核心正常工作
  - top/htop 显示全局平均值
  - 被卡住的核心不计入 CPU 使用率(因为它"不工作")

2.3 系统化排查步骤

bash
# === 第一步:检查内核日志(最关键!) ===
dmesg -T | grep -iE 'lockup|tsc|clocksource|nmi|mce|hardware error' | tail -50

# 典型输出示例:
# [Thu Aug 24 10:23:45 2026] clocksource: Switched to clocksource hpet
# [Thu Aug 24 10:23:46 2026] tsc: Marking TSC unstable due to check_tsc_sync_source failed
# [Thu Aug 24 10:24:15 2026] watchdog: BUG: soft lockup - CPU#7 stuck for 23s!
# [Thu Aug 24 10:25:30 2026] watchdog: Watchdog detected hard LOCKUP on cpu 3
# [Thu Aug 24 10:26:00 2026] mce: [Hardware Error]: Machine check events logged

# === 第二步:检查当前时钟源 ===
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
# 正常应该是:tsc
# 如果变成:hpet 或 acpi_pm → TSC 已切换,时间精度下降

# 查看所有可用时钟源:
cat /sys/devices/system/clocksource/clocksource0/available_clocksource

# === 第三步:检查每个 CPU 核心的状态 ===
# 查看 CPU 在线状态:
cat /sys/devices/system/cpu/cpu*/online 2>/dev/null | head -20
# 0 表示该核心已离线(可能被内核隔离)

# 查看每个核心的中断和软中断增量:
for f in /proc/irq/*/smp_affinity_list; do echo "$f: $(cat $f)"; done | head -20
cat /proc/softirqs | awk 'NR<=12{print}'

# === 第四步:检查 MCE(Machine Check Exception) ===
mcelog --client 2>/dev/null || journalctl -k | grep -i mce | tail -20
# MCE 是硬件错误的直接证据

# === 第五步:检查时间同步状态 ===
chronyc tracking
# 关注:
#   Reference ID    : 当前时间源
#   System time     : 与时间源的偏差
#   RMS offset      : 均方根偏移(> 1秒 = 严重)
chronyc sources -v

# === 第六步:检查 NMI watchdog 配置 ===
cat /proc/sys/kernel/nmi_watchdog
cat /proc/sys/kernel/hung_task_timeout_secs
cat /proc/sys/kernel/softlockup_thresh

# === 第七步:准备抓取 lockup 调用栈 ===
echo 1 > /proc/sys/kernel/softlockup_all_cpu_backtrace
# 下次 soft lockup 时会记录所有 CPU 的完整调用栈

# 配置 kdump(hard lockup 时自动生成 vmcore):
# yum install kexec-tools crash
# systemctl enable kdump
# 分析:crash vmlinux /var/crash/`<ts>`/vmcore
# crash> bt -a    # 查看所有 CPU 调用栈

2.4 解决方案(按根因分类)

根因 A:TSC 时钟源不稳定

bash
# 诊断确认:
dmesg -T | grep -i 'tsc.*unstable\|clocksource.*switch'
cat /sys/devices/system/clocksource/clocksource0/current_clocksource

# 临时修复:强制切回 TSC(如果硬件支持)
echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource

# 永久修复:内核启动参数
# 编辑 /etc/default/grub
# GRUB_CMDLINE_LINUX 中添加:
#   clocksource=tsc            # 强制使用 TSC
#   tsc=reliable               # 标记 TSC 为可靠(跳过校验)
#   -- 或者 --
#   clocksource=hpet           # 如果 TSC 确实不可靠,强制使用 HPET
# 然后:grub2-mkconfig -o /boot/grub2/grub.cfg

# 时间修正:
chronyc makestep    # 立即步进修正时间
# 或:
systemctl restart chronyd

# 预防措施:
# 1. BIOS 中关闭 C-States(C1E, C6 等 CPU 节能状态)
#    这些状态可能导致 TSC 在休眠时停止
# 2. BIOS 中关闭 CPU 变频(SpeedStep/Turbo Boost)
#    变频可能导致 TSC 频率变化
# 3. 虚拟机确保 hypervisor 提供 invariant TSC
#    VMware: tsc.scale = "TRUE"
#    KVM: 确保 CPU model 为 host-passthrough

根因 B:CPU 核心 Hard Lockup(硬件故障)

bash
# 确认哪个核心有问题:
dmesg -T | grep -i 'lockup.*cpu'
# 输出示例:watchdog: Watchdog detected hard LOCKUP on cpu 7

# 临时措施:隔离问题核心
# 将问题核心离线(online = 0):
echo 0 > /sys/devices/system/cpu/cpu7/online
# 注意:这不会修复根因,但可以让系统继续运行

# 确认核心已离线:
cat /sys/devices/system/cpu/cpu7/online  # 应该输出 0

# 永久隔离:通过内核参数
# GRUB_CMDLINE_LINUX 中添加:
#   maxcpus=N     # 限制最大 CPU 数
#   isolcpus=7    # 隔离 CPU 7(不参与调度)
#   或
#   cpuhp/blacklist=7  # 黑名单 CPU 7

# 长期方案:
# 1. 联系硬件厂商更换 CPU(hard lockup 通常是 CPU 硬件故障)
# 2. 更新 BIOS/UEFI 固件(某些 lockup 是 BIOS bug)
# 3. 检查电源供应(电压不稳也可能导致 lockup)

根因 C:内核 Bug 导致 Soft Lockup

bash
# 查看 lockup 时的调用栈:
dmesg -T | grep -A 30 'soft lockup.*stuck'
# 调用栈会显示卡在内核的哪个函数

# 常见 soft lockup 根因:
# 1. 内核死锁(两个锁互相等待)
# 2. 中断风暴(某个中断频率过高)
# 3. RCU stall(RCU 回调未及时处理)
# 4. 驱动 bug(网卡/存储驱动)

# 检查 RCU stall:
dmesg -T | grep -i 'rcu.*stall'

# 临时缓解:
# 增大 softlockup 阈值:
echo 60 > /proc/sys/kernel/watchdog_thresh

# 永久修复:
# 1. 升级内核(kernel bug 通常在后续版本修复)
# 2. 升级驱动(尤其是网卡、存储驱动)
# 3. 回滚最近的内核/驱动变更

2.5 真实生产案例

案例:某金融客户 RKE2 集群(8 核 32G 物理机 worker 节点)

时间线:
  14:00 - 运维收到告警:节点 szb12215 时间偏移 3 分 42 秒
  14:02 - 监控数据出现 2 分钟断点
  14:05 - 堡垒机 SSH 登录该节点超时(连续 3 次失败)
  14:08 - 运维通过 IPMI 控制台登录(绕过 SSH)

排查过程:
  1. dmesg -T | grep -iE 'lockup|tsc|clocksource'
     → 发现:
       [14:01:23] tsc: Marking TSC unstable due to check_tsc_sync_source failed
       [14:01:24] clocksource: Switched to clocksource hpet
       [14:02:15] watchdog: BUG: soft lockup - CPU#3 stuck for 22s! [kworker/3:1]
       [14:03:40] watchdog: Watchdog detected hard LOCKUP on cpu 7

  2. cat /sys/devices/system/clocksource/clocksource0/current_clocksource
     → hpet(已从 tsc 切换)

  3. chronyc tracking
     → System time: 222.4 seconds slow(偏移 3 分 42 秒)
     → RMS offset: 180+ seconds

  4. cat /sys/devices/system/cpu/cpu7/online
     → 1(核心仍在线,但已无响应)

  5. 手动隔离 CPU 7:
     echo 0 > /sys/devices/system/cpu/cpu7/online
     → SSH 立即恢复可用
     → 监控数据恢复连续
     → 但时间仍偏移(需要手动修正)

  6. chronyc makestep → 时间立即修正

根因分析:
  - CPU 7 号核心发生硬件故障(Hard Lockup)
  - 故障导致 TSC 同步检测失败
  - 内核自动将时钟源从 TSC 切换到 HPET
  - 切换瞬间时间跳变约 3 分钟
  - HPET 精度低于 TSC,时间持续漂移
  - sshd 进程和监控 Agent 偶尔被调度到 CPU 7 → 无法响应

长期修复:
  1. 联系服务器厂商,更换 CPU(RMA)
  2. 更新 BIOS 到最新版本
  3. GRUB 添加 isolcpus=7(临时隔离)
  4. 部署 clocksource 监控脚本(见下方)

2.6 预防与监控体系

bash
#!/bin/bash
# /usr/local/bin/check-cpu-health.sh
# 部署到所有节点,通过 cron 每 5 分钟执行一次

# 1. 检查 lockup
LOCKUP_COUNT=$(dmesg -T --since "5 minutes ago" 2>/dev/null | grep -c 'lockup')
if [ "$LOCKUP_COUNT" -ge 1 ]; then
  echo "CRITICAL: $LOCKUP_COUNT lockup events in last 5 minutes"
fi

# 2. 检查 clocksource 切换
CURRENT_CS=$(cat /sys/devices/system/clocksource/clocksource0/current_clocksource)
if [ "$CURRENT_CS" != "tsc" ]; then
  echo "WARNING: clocksource is $CURRENT_CS (expected tsc)"
fi

# 3. 检查时间偏移
if command -v chronyc &>/dev/null; then
  OFFSET=$(chronyc tracking 2>/dev/null | grep 'System time' | awk '{print $4}')
  echo "INFO: current time offset = ${OFFSET}s"
fi

# 4. 检查 MCE
MCE_COUNT=$(dmesg -T --since "1 hour ago" 2>/dev/null | grep -ci 'machine check')
if [ "$MCE_COUNT" -gt 0 ]; then
  echo "CRITICAL: $MCE_COUNT MCE events in last hour"
fi

3. 两个场景的对比总结

维度场景一:低 CPU + 高 Load场景二:低 CPU + 低 Load + 时间偏移
根因层级用户态 / 文件系统内核态 / 硬件
严重程度⚠️ 中等🔴 严重
影响范围特定进程(D 状态)整个系统(部分核心不可用)
排查入口ps aux + D 状态进程dmesg + clocksource
关键命令cat /proc/PID/stackdmesg | grep lockup
紧急恢复umount -l / NFS 修复隔离 CPU 核心
长期修复换存储 / 修复 NFS换 CPU / 更新 BIOS / 升级内核
监控指标D 状态进程数 + iostatclocksource + lockup 日志
K8s 影响Pod 健康检查超时节点 NotReady / SSH 不可用

4. 面试答题框架

面试官问:"CPU 使用率低但 Load 高,你怎么排查?"

答题结构(3 分钟版本):

1. 先澄清概念(30 秒):

"首先我想说明,Linux 的 Load Average 不仅包含可运行进程,还包含 D 状态(不可中断睡眠)的进程。所以 CPU 使用率低但 Load 高,通常意味着有大量进程在等待 I/O 或内核锁。"

2. 给出排查路径(1.5 分钟):

"我会按以下步骤排查:第一步,用 ps aux | awk '$8~/D/' 统计 D 状态进程数量。第二步,查看这些进程的等待函数(WCHAN)和调用栈。第三步,用 iostat 检查磁盘 I/O 是否饱和。第四步,检查 NFS 挂载点是否卡死。第五步,查看 dmesg 中的 hung_task 警告。"

3. 给出解决方案(1 分钟):

"根据根因不同,解决方案也不同:NFS 卡死用 umount -l 紧急恢复并调整挂载参数;磁盘饱和升级存储并分离 I/O 密集型应用;内核锁竞争调整内核参数或升级内核。"

面试官问:"CPU 和 Load 都正常,但时间偏移 3 分钟、监控断点、SSH 失败,你怎么看?"

1. 先定性(30 秒):

"这组症状非常典型——所有看似无关的症状同时出现,说明它们有一个共同的根因。我的第一判断是 CPU 核心级别的故障,具体是 Hard Lockup 或 TSC 时钟源不稳定。"

2. 解释为什么(1 分钟):

"CPU 使用率和 Load 正常,是因为只有个别核心卡住,其他核心正常工作,top 显示的是全局平均值。时间偏移是因为 TSC 不稳定后内核切换了时钟源。监控断点是因为监控 Agent 被调度到了卡住的核心。SSH 失败同理——sshd 进程被调度到不可用的核心。"

3. 给出排查和修复(1.5 分钟):

"排查:第一步看 dmesg 中的 lockup 和 clocksource 日志。第二步确认当前时钟源是否从 tsc 切换到了 hpet。第三步确认是哪个 CPU 核心出了问题。紧急修复:将问题核心离线。长期修复:联系厂商更换硬件,更新 BIOS,并部署 clocksource 和 lockup 的监控脚本。"

面试官评价标准

水平回答特征
初级(不通过)"可能是网络问题"、"重启一下就好了"、"Load 高就是 CPU 忙"
中级(基本通过)知道 D 状态进程导致 Load 高;知道 iostat 和 NFS;但对场景二没有思路
高级(通过)准确解释 Linux Load Average 定义;完整 D 状态排查路径;场景二能联想到 TSC/clocksource 切换
卓越(加分)主动提到 NMI watchdog、Hard Lockup;解释全局平均值的盲区;给出完整监控方案

5. 核心命令速查表

bash
# === 场景一:低 CPU + 高 Load ===
ps aux | awk '$8 ~ /D/'                    # D 状态进程列表
cat /proc/`<pid>`/stack                       # 进程内核调用栈
cat /proc/`<pid>`/wchan                       # 等待的内核函数
iostat -xz 1                                # I/O 统计
iotop -oP                                   # I/O 最大的进程
timeout 3 ls /mnt/nfs                       # 测试 NFS 挂载
dmesg -T | grep 'blocked for more than'     # hung task 日志
umount -f -l /mnt/nfs                       # 强制 lazy umount

# === 场景二:时间偏移 + 监控断点 + SSH 失败 ===
dmesg -T | grep -iE 'lockup|tsc|clocksource|nmi|mce'
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
cat /sys/devices/system/cpu/cpu*/online
echo 0 > /sys/devices/system/cpu/cpu`N`/online  # 隔离问题核心
chronyc tracking                              # 时间同步状态
chronyc makestep                              # 立即修正时间
mcelog --client                               # MCE 硬件错误

# === 通用 ===
perf top -g                                   # 实时内核热点
sar -q 1 5                                    # Load 历史
mpstat -P ALL 1                               # 每核 CPU 使用率
vmstat 1                                      # 系统全局状态