Linux服务器CPU抖动本质是调度不稳或资源争抢所致,需从进程行为、中断、内核调度、硬件固件四层排查:查短命进程与唤醒风暴、高频中断源、CFS调度延迟及BIOS/微码/NVMe异常。

Linux服务器CPU抖动通常表现为负载(load average)或CPU使用率在短时间内剧烈波动,但整体平均值不高,服务响应却偶发延迟或超时。这往往不是单纯“CPU跑满”,而是调度不稳、资源争抢或内核行为异常所致。排查需从进程行为、中断、内核调度、硬件底层四个层面入手。
看实时进程行为:有没有“短命高耗”或“唤醒风暴”
很多抖动源于大量短生命周期进程反复创建/销毁,或某进程频繁被唤醒抢占CPU:
- 用 pidstat -w 1 观察每秒任务切换(cswch/s)和每秒唤醒次数(nvcswch/s),若某进程的 nvcswch/s 突然飙升到上万,可能是轮询、忙等待或锁竞争导致
- 用 top -H 或 htop(开启线程视图)查看是否有大量同名线程反复出现又消失,尤其注意 Java 应用的 GC 线程、Netty 的 NioEventLoop 线程
- 检查 crond、systemd-timers、logrotate 等定时任务是否配置了秒级执行,或脚本中用了 while true; do ...; sleep 0.1; done 这类反模式
查中断与软中断:网卡、时钟、NVMe 是否在“刷屏式”打断
高频中断会挤压用户态时间,造成 CPU 使用率“虚高”且抖动明显,top 中 %si(softirq)偏高是典型信号:
- 运行 cat /proc/interrupts,关注 eth0、nvme、timer 对应的 IRQ 计数,对比抖动前后是否某一行增长异常快
- 用 sudo cat /proc/softirqs 查看 NET_RX、TIMER、SCHED 等软中断计数,若 NET_RX 每秒跳涨数万,可能是网卡收包过载或 RSS 配置不当
- 尝试关闭 NIC offload 功能测试:ethtool -K eth0 gro off gso off tso off;对多队列网卡,确认 irqbalance 正常,或手动绑定中断到特定 CPU
盯内核调度与CFS行为:有没有“调度延迟”或“CPU亲和失衡”
CPU 抖动有时是调度器本身在“挣扎”——比如大量 SCHED_OTHER 进程挤在单个 CPU 上,或 cgroup 限频策略引发周期性节流:
- 启用调度延迟追踪:echo 1 > /proc/sys/kernel/sched_latency_ns 后观察 /proc/sched_debug 中的 nr_switches、nr_migrations 和 avg_idle
- 检查是否启用了 CPU 频率调节器(cpupower frequency-info),ondemand 或 conservative 在负载突变时可能造成频率反复升降,改用 performance 可排除干扰
- 用 ps -eo pid,comm,psr,ni,pri,rtprio | grep -v " R " 查看关键进程是否被错误绑核(psr 列),或因 nice 值/优先级设置不合理被持续抢占
验硬件与固件:别忽略 BIOS、微码、NVMe/RAID 卡异常
某些抖动根源不在 OS 层,而在固件或硬件交互异常:
- 更新 BIOS 和 CPU 微码(intel-microcode / amd64-microcode 包),尤其注意 Intel 的 TSX 异常、AMD 的 Spectre v2 补丁引发的调度开销升高问题
- 检查 NVMe 盘健康状态:sudo nvme smart-log /dev/nvme0n1,重点关注 Media and Data Integrity Errors、Error Information Log Entries;部分盘固件 bug 会导致 I/O 完成中断风暴
- RAID 卡(如 LSI MegaRAID)后台重建、巡检或电池学习过程会引发周期性中断激增,通过 MegaCli64 -AdpBbuCmd -GetBbuStatus -aALL 等命令确认当前状态










