在撰写本文时,htop
显示两个内核的内核线程利用率约为 50%(红色条)。从之前的启动中我知道,随着时间的推移,这将增加到 3 个甚至 4 个核心,每个核心的利用率为 50%。 htop 显示的任何线程的 cpu 使用率都没有超过 1%。这有点奇怪不是吗?
我尝试进一步调查它,并perf record -a
以 root 身份使用,发现所有样本的 11.3% 位于swapper
函数中命令的内核线程中intel_idle
。
我假设这个swapper
命令对应于我在 htop 中看到的奇怪的 cpu 占用,但是有人可以向我解释以下一些问题:
- 是什么原因造成的?是bug还是我的设置有问题?
- 这会影响我系统的整体性能吗?
- 我怎样才能摆脱这个?
有关我的系统的更多详细信息:
$ uname -a
Linux [...] 4.8.0-0.rc2.git2.2.fc26.x86_64 #1 SMP Wed Aug 17 22:16:04 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 94
Model name: Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
Stepping: 3
CPU MHz: 799.804
CPU max MHz: 4200.0000
CPU min MHz: 800.0000
BogoMIPS: 8016.00
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 8192K
NUMA node0 CPU(s): 0-7
Flags: [...]
更新:在负载下,行为有点不同。 (首先请注意,我现在处于三个核心,每个核心的利用率为 50%,性能将在内部报告 27% intel_idle
)。我将我的 cpu 置于压力之下,sysbench --test=cpu --num-threads=8 --max-requests=1000000 run
并进行htop
检查perf
。 Htop 报告 3 个核心在内核中处于 100%(与空闲期间显示为 50% 的核心相同),5 个核心在 100% 用户空间。 Perf 报告 sysbench 占用了我的 cpu 的 85%,并且没有解释剩余的 15%...我不确定这意味着什么。我的 CPU 性能是否有效降低至 85%?
答案1
这个答案主要是推测性的,因为我对英特尔处理器上的电源管理一无所知,也没有看过 Linux 代码,但我认为这是合理的。
我认为derobert 对电源管理的解释这是正在发生的事情。电源管理是功耗和性能之间的折衷。当处理器没有以 100% 的峰值性能使用时,降低其频率是有益的,这会使其速度更慢但温度更低。
Linux 会随时间变化 CPU 频率。它如何做到这一点是由称为州长。总体思路是,当系统一段时间没有充分利用 CPU 性能时,就会降低 CPU 频率。相反,如果CPU持续忙碌一段时间,内核就会提高频率。
看到intel_idle
调度意味着核心没有执行代码,但实际上处于“挂起”模式,消耗很少的电量。这比仅仅降低频率带来更大的节能效果,但成本更高:尽管 CPU 在打断发生,这需要一些时间(几十微秒?更多?)。
intel_idle
当你没有充分利用你的所有核心时,这是完全正常的。与 CPU 始终全速运行相比,这可以节省大量电量(无论是处理器本身还是冷却设备)。您可能必须禁用此机制的唯一原因是如果您需要非常低的潜伏。如果您运行 CPU 密集型应用程序,您会看到越来越少的intel_idle
.使用 CPU 空闲模式不会影响性能,除非在内核尚未完全确定系统需要大量 CPU 功率的过渡期间。
如果你的核心完全饱和,你将达到 0% intel_idle
。请注意,可能很难使所有核心饱和(尽管专门设计的基准测试可以做到这一点),因为正在执行的所有代码和数据都不适合 CPU 缓存,限制因素将是 RAM 访问速度。 “所有代码和数据”包括机器上运行的所有内容,包括您的用户界面;实际上,使所有核心饱和的情况很少见。