|
一、问题现象在虚拟机内部使用 top 命令,CPU 显示 99.5% us,load average 高达 30+。但同时用 uptime 查看 load average 只有 0.39,用 ps aux --sort=-%cpu 查看所有进程的 CPU 加起来不到 50%,htop 单进程最高才 27%(就是 htop 自身)。两者结论完全矛盾。二、环境信息- 宿主机:HCI 超融合平台(具体版本待查)- 虚拟机 OS:CentOS Linux 7 (Core),内核 3.10.0-1160.119- vCPU 配置:4 核- 内存:16GB- 运行服务:Node.js 后端(PM2 管理)、MariaDB、httpd三、关键数据对比(同一时刻采集)1) top -b -n 1 输出:%Cpu(s): 99.2 us, 0.8 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st↑ idle=0, steal=02) vmstat 1 3 输出:procs r:33 | cpu us:100 sy:0 id:0 wa:0 st:0↑ 中断数 in: 32681/s(远超正常值 2000~5000)3) ps aux --sort=-%cpu | head -15:进程 %CPU 说明htop 26.7% (监控工具自身)mysqld 4.5%sangfor_* 0.1%~2.4% ×12 个深信服从进程node app.js 2.1%pm2 monit 2.0%所有进程累加 ≈ 42%(单核视角)→ 整机真实占用约 10%4) uptime:load average: 0.39, 0.21, 0.16 ← 非常低,与 top 的 load 30+ 不符5) /proc/stat 连续采样(2秒间隔):第一次: cpu 38858473 565 252334 124963 ...第二次: cpu 38864799 565 252395 124963 ... ↑ idle 从未增加(差值为 0)手动计算:busy=(6389)/total=(6391)=99.97%6) dmesg 内核日志无 OOM、无错误。磁盘 8.8TB 用了 11%,内存充足。Node 进程只占 94MB RSS。四、核心矛盾ps aux 说"没有进程在吃大量 CPU"——所有进程加起来才 42%。top/vmstat/proc/stat 说"CPU 已经满载了"——idle=0,us=100%。这两个结论不可能同时为真。如果真有进程把 CPU 吃满,ps aux 一定能看到它的 %CPU 很高。五、初步判断方向怀疑是虚拟化层导致 /proc/stat 的 idle 计数器停止增长:- 时钟源频繁切换:dmesg 有 "Switched to clocksource tsc/kvm-clock" 记录- 中断风暴:vmstat 显示每秒中断 32000+ 次(正常物理机 <5000)- 12 个 sangfor_guest_* 进程常驻运行- top 显示的 st(steal time)=0,但 idle 也=0,说明时间被计入 user 态而非 steal 态——可能是 VMM 时间计量的 bug六、影响业务本身不受影响(真实 CPU 占用只有 ~10%),但监控面板全部报警 100%,无法通过监控工具判断真实负载状态。七、请求帮助1. 这是 HCI 虚拟化层的已知问题吗?有没有修复方案或补丁?2. 是否需要升级虚拟化工具版本(VMOptimizationTools)?3. 有没有推荐的配置调整可以让 /proc/stat 报告准确的 CPU 使用率?4. 如果这是预期行为,有没有官方推荐的真实 CPU 监控方法?谢谢! |