超线程启用时线程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周期数增加:
- IPC显著降低:未使用超线程时IPC在1.09-1.18之间,启用超线程后降至0.91-0.92。这意味着每个CPU周期能执行的指令数减少,完成相同任务需要更多CPU周期。
- 总周期数上升:启用超线程后,线程消耗的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
相关产品推荐
相关产品推荐

