在麒麟操作系统(如麒麟V10等版本)中准确掌握物理内核的真实负载,远不止简单查看CPU使用率。关键陷阱在于:必须明确区分“逻辑CPU”与“物理核心”。尤其是启用超线程后,逻辑CPU数量会翻倍,而实际承载计算任务的物理核心数量不变。若仅看平均负载,极易被“虚高”数据误导。因此,核心策略是穿透到每个物理核心内部,监测其真实占用状态。

确认物理核心数量与拓扑结构
第一步,使用 lscpu 命令。重点关注两个字段:Core(s) per socket(每个CPU插槽的核心数)与 Socket(s)(CPU插槽数)。两者相乘即得物理核心总数。例如,2个插槽 × 16个核心 = 32个物理核心。
第二步,核对 Thread(s) per core 字段。若值为2,表示超线程已开启。此时 lscpu | grep "CPU(s)" 显示的80个逻辑CPU,实际只对应40个物理核心。若值为1,逻辑CPU数与物理核心数一致,分析更为直接。
第三步,若需更精细验证,可查看 /sys/devices/system/cpu/topology/core_id 文件。该文件能明确每个逻辑CPU所属的物理核心,为后续负载归并提供可靠依据。
使用mpstat按物理核心粒度采集实时负载
方法简单:若系统未安装 sysstat,先执行 sudo apt install sysstat -y 安装。然后运行 mpstat -P ALL 1 1,结果中每一行对应一个逻辑CPU的实时占用情况。
关键步骤在于“归并”。假设需查看物理核心0的负载,若之前确认 Thread(s) per core = 2,且CPU0与CPU1共享同一物理核心,则执行 mpstat -P 0,1 1 1,观察这两行的 %idle(空闲百分比)是否同步大幅下降。若仅一行%idle骤降,另一行仍高,说明负载并未真正压到该物理核心,而是被调度至其他物理核心——这是一个典型的负载不均衡信号。
利用/proc/stat精确反推单物理核心负载率
此方法更精准,适合深度分析。步骤稍多,但逻辑清晰:
第一步,拍摄快照。执行 cat /proc/stat | grep "^cpu[0-9]" | head -n $(lscpu | grep "CPU(s):" | awk '{print $2}') > /tmp/cpu_before,保存所有逻辑CPU的时间片累计值。
第二步,等待2秒。再次运行相同命令,将输出重定向到 /tmp/cpu_after。
第三步,编写awk脚本,计算每个逻辑CPU在这2秒内的负载率。公式:(user+nice+system+idle+iowait+irq+softirq+steal)的总差值减去idle差值,再除以总差值,即得实际占用率。这一步能精确计算每个逻辑CPU的负载。
第四步,归并。提取属于同一物理核心的所有逻辑CPU负载率,取最大值。该最大值即该物理核心的真实峰值负载。若发现某个物理核心下所有逻辑CPU负载率均低于15%,而另一物理核心普遍高于75%,则负载不均衡问题显著。
用top切换至逐核视图并人工映射物理核心
top 命令同样可以辅助分析。执行 top 后,按数字键 1,顶部将显示 %CPU0、%CPU1 …… 直至 %CPUn-1 的实时条形图。
此时仔细对比:若CPU0与CPU1的起伏节奏几乎完全一致,数值相近,则它们大概率属于同一物理核心。反之,若CPU0飙升至95%,而CPU2仅5%,则表明物理核心0已满负荷,而物理核心1处于闲置状态。
【特别提醒】 此方法的前提是CPU编号顺序与物理拓扑一致。麒麟V10 SP3及以上版本默认如此。若系统在BIOS中禁用了超线程,或手动绑定了核心,需先执行 lscpu 确认编号逻辑,否则可能得出错误结论。
