
DragonflyBSD官方微信:BSDchina 或 BSD操作系统 加关注 邮箱:seallyhs@gmail.com
首先介绍一下在DragonflyBSD上的主要功耗管理功能。
- ACPI P-state(支持CPU功耗域)。
- ACPI C-state。在相对较新的Intel CPU上(最老的测试过的CPU也是Sandy Bridge的)DragonFlyBSD的做法和其他BSD不一样。DragonFlyBSD不使用I/O端口来进入ACPI C2/C3。DragonFlyBSD使用_OSC来告知BIOS操作系统支持native C2/C3。BIOS则将ACPI C2/C3到mwait C-state映射通过GAS告知DragonFlyBSD。同时GAS中还包含其他信息,比如进入ACPI C3是否需要检查bus master状态。同时从core2开始Intel CPU进入ACPI C3就不需要冲刷cache或者使能bus master仲裁。有了这些先决条件后,进入ACPI C2/C3其实就简化为执行monitor/mwait指令了。
- Intel Performance and Energy Bias Hint。根据Intel软件开发人员手册,这个功能可以提示硬件是偏向性能呢还是偏向节省能耗。
- mwait C-state。这个功能需要mwait的一个扩展(这个扩展在较新的CPU上都有)。但是如果在进入ACPI C3前需要检测bus master状态,冲刷cache或者需要使能bus master仲裁的话,那比mwait C2/0更深的mwait C-state就不能被直接使用。
========================
ACPI P-state
在Intel i7-3770 3.40GHz,Intel i5-3230M 2.60GHz和很多其他较新的Intel CPU上(Matthew Dillon帮忙测试的),改变ACPI P-state不会降低功耗。在这些Intel CPU上改变ACPI P-state只会影响动态频率,比如在Intel i5-3230M上(系统基本空闲):
ACPI P-state 2601 (TurboBoost):
hw.sensors.cpu0.freq0: 2721627000 Hz (cpu0 freq)
hw.sensors.cpu1.freq0: 2751159000 Hz (cpu1 freq)
hw.sensors.cpu2.freq0: 2627060000 Hz (cpu2 freq)
hw.sensors.cpu3.freq0: 2191103000 Hz (cpu3 freq)
ACPI P-state 2600:
hw.sensors.cpu0.freq0: 2266678000 Hz (cpu0 freq)
hw.sensors.cpu1.freq0: 2401977000 Hz (cpu1 freq)
hw.sensors.cpu2.freq0: 2248562000 Hz (cpu2 freq)
hw.sensors.cpu3.freq0: 2406333000 Hz (cpu3 freq)
ACPI P-state 1200:
hw.sensors.cpu0.freq0: 1197281000 Hz (cpu0 freq)
hw.sensors.cpu1.freq0: 1197340000 Hz (cpu1 freq)
hw.sensors.cpu2.freq0: 1197284000 Hz (cpu2 freq)
hw.sensors.cpu3.freq0: 1197300000 Hz (cpu3 freq)
然而在Intel E5-2620 v2 2.10GHz上,改变ACPI P-state可以降低功耗。但是根据我的测试,功耗变化仅限于使能TurboBoost和关闭TurboBoost:
ACPI P-state 2101 (TurboBoost): 94.6w
ACPI P-state 2100: 92.5w
ACPI P-state 1200: 92.5w
========================
Intel Performance and Energy Bias Hint
在我测试过的Intel CPU上,调整这个参数基本没用,即没有功耗变化,CPU也没有温度变化。
========================
ACPI C-state
在我测试过的Intel CPU上,ACPI C-state都是映射为mwait C-state的并且不需要bus master操作,因此我们直接进入下一段。
========================
mwait C-state
在我和Matthew Dillon测试过的Intel CPU上,使用mwait C-state都是能够降低功耗的。我测试的几个CPU的功耗:
Intel i7-3770 (ACPI P-state 3401):
mwait C1/0: 38.3w
mwait C1/1: 38.3w
mwait C2/0: 37.6w
mwait C3/0: 36.8w
Intel i5-3230M (ACPI P-state 2601):
mwait C1/0: 14.7w
mwait C1/1: 14.7w
mwait C2/0: 13.3w
mwait C3/0: 12.9w
mwait C4/0: 12.9w
mwait C4/1: 12.9w
Intel E5-2620 v2 (2-way)
(ACPI P-state 2101 TurboBoost):
mwait C1/0: 94.6w
mwait C1/1: 94.6w
mwait C2/0: 93.7w
mwait C3/0: 92.3w
(ACPI P-state 2100~1200):
mwait C1/0: 92.5w
mwait C1/1: 92.5w
mwait C2/0: 85.3w
mwait C3/0: 83.8w
基本共通的一点是mwait C1/0和mwait C1/1(C1E?)是没有功耗区别的。很有可能是因为当所有的core都进入C1后,CPU会进入C1E(Intel E5-2600 v2的datasheet中有提到)。
虽然越深的mwait C-state越是能降低功耗,但是越深的mwait C-state会导致越大的延时。经我测试当CPU进入深度package C-state时,延时可以大到将近40us。以下是不同的mwait C-state的CPU延时测试结果(使用debug.ipiq.latency_test):
Intel i7-3770 (ACPI P-state 3401):
mwait C1/0 and C1/1: 760ns
mwait C2/0: 18us
mwait C3/0: 25us
Intel i5-3230M (ACPI P-state 2601):
mwait C1/0 and C1/1: 950ns
mwait C2/0: 21us
mwait C3/0, C4/0, C4/1: 26us
Intel E5-2620 v2 (2-way)
(ACPI P-state 2101 TurboBoost)
mwait C1/0 and C1/1: 同一物理CPU 2200ns,不同物理CPU 2600ns
mwait C2/0: 同一物理CPU 15us,不同物理CPU 24us
mwait C3/0: 同一物理CPU 33us,不同物理CPU 37us
(ACPI P-state 2100)
mwait C1/0 and C1/1: 同一物理CPU 2200ns,不同物理CPU 2600ns
mwait C2/0: 同一物理CPU 15us,不同物理CPU 22us
mwait C3/0: 同一物理CPU 26us,不同物理CPU 36us
在Intel E5-2620 v2 (2-way) TurboBoost模式下,在同一物理CPU上mwait C2/0和mwait C3/0的测试中偶尔出现60us的延时(目前我还没有发现原因)。
如果你的应用对延时比较敏感,那使用较深的mwait C-state时要注意。
--------
在有些情况下使用较深的mwait C-state既能降低能耗又能让你的系统运行的更快!我发现在一些情况下较深的mwait C-state可以让负载较高的CPU睿频到更高的频率。以下是我在Intel E5-2620 v2 (2-way) (ACPI P-state 2101 TurboBoost)的测试结果:
make -j 48 -DNO_MODULES buildkernel KERNCONF=LINT64
强制所有的CPU在空闲时使用mwait C1/0。以上命令花费的时间:182秒
make depend时的功耗:110w
make depend时的CPU主频:2.37GHz
完全运行时的功耗:161w
完全运行时的主频:2.4GHz
强制所有的CPU在空闲时使用mwait C3/0。以上命令花费的时间:180秒(快了2秒!)
make depend时的功耗:106w(省了4w)
make depend时的CPU主频:2.57GHz(高了200MHz)
完全运行时的功耗:161w
完全运行时的主频:2.4GHz