锁定 C-state 能提高 CPU 性能吗?

tl;dr

不能。

背景

用户发现,尽管设置了 'performance' 作为 cpuspeed 的 governor (/etc/sysconfig/cpuspeed), 但是 CPU 并不是一直处于最高频率运行。用户希望保持最高频率运行,不考虑节能,要发挥出 CPU 的最高性能。

设置 cpu_dma_latency 可以锁定 C-state

在现代 Intel CPU 的设计中,为了节能,CPU 的不同 core 会有不一样的 C-state。 C0, C1, C6 代表不同的节能阶段, C6 最节电。当系统处于空闲时,CPU 会进入 C6,而如果此时突然系统负载增大(比如股票开市的时刻),CPU 需要从 C6 切换回 C0,而这个切换需要时间,从而带来延迟(大约 200 us)。[1]

在 RHEL6 中,我们可以在内核启动参数中,添加 'processor.max_cstate=1 intel_idle.max_cstate=0' 来锁定 CPU 的 C-state.

在 RHEL7 中,我们可以使用 tuned 的 'latency-performance' profile 来锁定 CPU C-state. tuned 的 'latency-performance' 实际上会应用 /dev/cpu_dma_latency 接口,锁定最大的延时为 1 us,从而锁定 C-state. [2]

锁定 C-state,超频会减小

锁定了 C-state,可以让 CPU 更费电,但更费电不一定代表更高性能。锁定 C-state 的重点是为了减少在负载突然增加的一瞬间的延迟时间,它对提高运算速度没有帮助。

我们在 Turbo Boost (超频)关闭的情况下,进行一个运算测试(比如 awk 'BEGIN {for(i=0;i<10000;i++)for(j=0;j<10000;j++) ;}' ), 从结果看到,运算时间在各种模式下没有区别。

============ Turbo Boost Disabled ============
performance: ~28.7 s
performance + processor.max_cstate=1 intel_idle.max_cstate=0:  ~28.7 s

而如果开启了 Turbo Boost, 锁定 C-state 反而让性能下降了。

============ Turbo Boost Enabled ============ 
performance: ~23.2 s
performance + processor.max_cstate=1 intel_idle.max_cstate=0:  ~25.2 s

如果锁定了 C-state, CPU 的多个核就无法进入节能模式,而 Turbo Boost 的频率是与当前有多少个 Active Core 有关的。[3]

这么看来,尽管 C-state 可以使 CPU 更费电,但并不能提高性能,且有可能降低 Turbo Boost 的效果。

参考文档

[1] Power Management States: P-States, C-States, and Package C-States
https://software.intel.com/en-us/articles/power-management-states-p-states-c-states-and-package-c-states
[2] PM Quality Of Service Interface.
https://www.kernel.org/doc/Documentation/power/pm_qos_interface.txt
[3] Intel® Turbo Boost Technology Frequency Table for Intel® Core™ i7 Processors
http://www.intel.com/content/www/us/en/support/processors/000006652.html