[文档/cpu-load.txt] 包括一个示例程序,
smallhog.c
.根据 LKML.org 上的链接线程,它能够占用 CPU,并且内核仅报告百分之几或更少的 CPU 使用率。我尝试在当前系统上编译并运行它。内核报告该程序的 CPU 使用率约为 80%。所以情况似乎发生了一些变化。
来源:Documentation/cpu-load.txt 表示 Linux cpu 负载 *可能* 具有误导性。是否有未提及的新(或旧)缓解措施?
但smallhog.c仍然有一些影响。根据“任务时钟” perf stat
,它真的使用大约 100% 的 CPU 时间。但正常的 CPU 统计认为top
它只使用了 80% 的 cpu 时间。中的“user”+“sys”也是如此perf stat
。
为什么我的特定系统不报告 100% CPU 使用率smallhog.c
?
我的内核版本是5.1.15-300.fc30.x86_64。
Linux 说我的 TSC 稳定。
$ sudo perf stat ./smallhog
^C./smallhog: Interrupt
Performance counter stats for './smallhog':
10,072.25 msec task-clock # 1.000 CPUs utilized
235 context-switches # 0.023 K/sec
65 cpu-migrations # 0.006 K/sec
44 page-faults # 0.004 K/sec
28,736,276,128 cycles # 2.853 GHz 75.00%)
18,394,555,284 instructions # 0.64 insn per cycle (74.99%)
3,530,232,530 branches # 350.491 M/sec (75.01%)
58,545,233 branch-misses # 1.66% of all branches (75.01%)
10.076806251 seconds time elapsed
3.481505000 seconds user
4.458544000 seconds sys
$ sudo journalctl -k |grep -iE "tsc|sched_clock"
Jul 09 10:58:25 localhost kernel: tsc: Fast TSC calibration using PIT
Jul 09 10:58:25 localhost kernel: tsc: Detected 2294.623 MHz processor
Jul 09 10:58:25 localhost kernel: clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x21135dc5295, max_idle_ns: 440795305870 ns
Jul 09 10:58:25 localhost kernel: TSC deadline timer enabled
Jul 09 10:58:25 localhost kernel: clocksource: Switched to clocksource tsc-early
Jul 09 10:58:25 localhost kernel: sched_clock: Marking stable (1353126208, 521414)->(1368149024, -14501402)
Jul 09 10:58:25 localhost kernel: tsc: Refined TSC clocksource calibration: 2294.689 MHz
Jul 09 10:58:25 localhost kernel: clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x21139c00f92, max_idle_ns: 440795293667 ns
Jul 09 10:58:25 localhost kernel: clocksource: Switched to clocksource tsc
$ lscpu
...
Vendor ID: GenuineIntel
CPU family: 6
Model: 61
Model name: Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz
Stepping: 4
CPU MHz: 1189.926
CPU max MHz: 2900.0000
...
答案1
因为另外 20% 的 CPU 时间用于中断:-D。
smallhog
在特定 CPU 上运行,使用taskset -c 0 ./smallhog
.在里面top
,按1键。结果如下:
%Cpu0 : 22.6 us, 56.1 sy, 0.0 ni, 0.0 id, 0.0 wa, 21.3 hi, 0.0 si, 0.0 st
hi
意思是“硬件中断”。