You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

超线程启用时线程CPU占用更高?附perf统计数据求助分析

超线程场景下CPU占用率升高的原因分析

问题背景

我有一台启用超线程的2核机器,对应4个vCPU(0、1、2、3)。目前已有若干线程被固定到vCPU 1和3(未使用超线程),现有一个测试线程:

  • 固定到0、1、2、3全vCPU时,CPU占用率为40%
  • 仅固定到1、3时,CPU占用率为35%

无法理解启用超线程后CPU占用率反而更高的现象,已使用Ubuntu系统的perf stat命令收集性能数据,具体如下:


未使用超线程时的perf统计(线程固定到1、3)

统计命令1

perf stat -e task-clock,cycles,instructions,cache-references,cache-misses --tid=26269 sleep 10

线程ID '26269' 的性能计数器统计:

3341.549477      task-clock (msec)         #    0.334 CPUs utilized
   10836409509      cycles                    #    3.243 GHz
   11797254268      instructions              #    1.09  insn per cycle
      68052778      cache-references          #   20.366 M/sec
      23498429      cache-misses              #   34.530 % of all cache refs

统计命令2

perf stat -B --tid=26269 sleep 10

线程ID '26269' 的性能计数器统计:

3112.732648      task-clock (msec)         #    0.311 CPUs utilized
         17296      context-switches          #    0.006 M/sec
           290      cpu-migrations            #    0.093 K/sec
          2683      page-faults               #    0.862 K/sec
   10043236414      cycles                    #    3.227 GHz
   11821047920      instructions              #    1.18  insn per cycle
    2596058193      branches                  #  834.013 M/sec
      30134052      branch-misses             #    1.16% of all branches

使用超线程时的perf统计(线程固定到0、1、2、3)

统计命令1

perf stat -e task-clock,cycles,instructions,cache-references,cache-misses --tid=26269 sleep 10

线程ID '26269' 的性能计数器统计:

3878.410557      task-clock (msec)         #    0.388 CPUs utilized
   12921569032      cycles                    #    3.332 GHz
   11787482531      instructions              #    0.91  insn per cycle
      72454684      cache-references          #   18.682 M/sec
      19096660      cache-misses              #   26.357 % of all cache refs

统计命令2

perf stat -B --tid=26269 sleep 10

线程ID '26269' 的性能计数器统计:

3777.149613      task-clock (msec)         #    0.378 CPUs utilized
         12162      context-switches          #    0.003 M/sec
          1166      cpu-migrations            #    0.309 K/sec
             0      page-faults               #    0.000 K/sec
   12764333134      cycles                    #    3.379 GHz
   11796018618      instructions              #    0.92  insn per cycle
    2588826495      branches                  #  685.392 M/sec
      32417514      branch-misses             #    1.25% of all branches

原因分析

从perf数据可以看出,核心差异在于每周期指令数(IPC)下降以及CPU周期数增加:

  1. IPC显著降低:未使用超线程时IPC在1.09-1.18之间,启用超线程后降至0.91-0.92。这意味着每个CPU周期能执行的指令数减少,完成相同任务需要更多CPU周期。
  2. 总周期数上升:启用超线程后,线程消耗的CPU周期从约100亿增加到约127亿,直接导致task-clock(CPU占用时间)从约3100ms升至约3777ms,对应CPU利用率从31%左右涨到37%,和观察到的35%→40%的占用率变化一致。

深层原因是超线程的资源竞争:

  • 超线程的两个逻辑核(比如0和1属于同一物理核,2和3属于另一物理核)共享物理核的执行单元、缓存带宽等资源。当测试线程被调度到0或2时,会和已经固定在1或3的线程争抢同一物理核的资源,导致指令执行效率下降,需要更多周期才能完成相同工作量。
  • 虽然缓存命中率有所提升(缓存 miss 率从34.5%降到26.4%),但这种收益不足以抵消执行单元竞争带来的IPC下降,最终表现为整体CPU占用率升高。

另外,CPU频率略有上升(从3.2GHz左右升到3.3GHz),但频率提升带来的周期数增加幅度远小于IPC下降导致的周期需求增长,所以整体占用率还是上升。

内容的提问来源于stack exchange,提问作者rmp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:25:28