P状态的使用方法

P状态是CPU正在运行时的电力状态。通过设置为更深的P状态就可以控制电能消耗。P状态下是通过降低频率来降低电能消耗的,因此性能和电能之间是不可兼得的关系。Linux下可以根据CPU的使用情况来设置P状态。另外,与C状态同样,根据用户设置的策略P状态有不同的性能。

与P状态相关的ACPI接口如下。在启用ACPI的系统中,在Linux下使用这些接口来控制cpufreq驱动程序。


_PCT(Performance Control)


使处理器进入P状态的接口。向PERF_CTRL写入控制寄存器(control register)值来进入P状态。根据使用_PPC方法得到的值来选择P状态的值。写入时使用的控制寄存器值是通过_PPC的Control字段获得的值。

写入成功后,PERF_STATUS的值与相关的_PSS的Status字段相同。在x86的情形下,PERF_CTRL、PERF_STATUS安装在PIO或MSR中(作为Functional固定硬件(FFH)安装时)。

P状态的使用方法 - 图1


_PSS(Performance Supported Status)


该接口用来显示处理器支持的P状态。各P状态中分别保存了CPU频率、电能消耗、控制寄存器值、status寄存器值。

P状态的使用方法 - 图2


_PPC(Performance Present Capabilities)


_PPC用于动态显示某个时间点平台所支持的P状态值。操作系统等从_PSS内的入口中,选择电能低于_PPC所得的值的P状态。例如,当_PSS有P0~P3的入口,而_PCC显示为1时,必须从P1状态到P3状态中选择P状态。_PPC的值是在连接、切断如DCMI[1]等这样的外部接口或电源适配器(AC adapter)时,通过BIOS动态变更。_PPC的值一旦变更,就会发生通知事件,操作系统再次执行_PPC。


_PSD(P-State Dependency)


P状态的控制中用来获取CPU之间依存关系的信息的对象如下所示。

P状态的使用方法 - 图3

在Linux的cpufreq子系统中,存在用来运行cpufreq的驱动程序和决定驱动程序运行策略的驱动程序。运行cpufreq的驱动程序在每个CPU或系统中各不相同,而在支持ACPI的系统中基本上使用的是acpi-cpufreq驱动程序。由于一些系统的acpi-cpufreq无法正常运行,因此有的系统使用powernow-k8、p4-clockmod、speedstep-centrino等驱动程序。

Linux中可使用的省电governor如下。

P状态的使用方法 - 图4

performance、powersave作为governor比较容易理解,但有时ondemand、conservative、userspace会不清楚应使用哪一个。一般多使用ondemand或userspace。ondemand在内核内测定负载,根据负载改变频率。因此,就可以在不察觉性能降低的情况下降低电能消耗。但是由于需要立刻改变频率的功能,因此并不是所有CPU中都可以使用。在userspace中cpuspeed等守护进程考虑/etc/sysconfig/cpuspeed等的设置内容来改变频率。在userspace中检测负载、更改频率是有延迟的,因此在负载变化剧烈的系统中,系统的应答时间可能会很紧迫。conservative和ondemand的区别就是conservative并非无论在哪种负载下都立即设置为最大频率,而是慢慢地改变频率。这个功能在笔记本电脑之类使用电池的系统中可以有效地发挥抑制电能消耗的效果。

需要注意的是,一般来说,performance和powersave并不是以抑制电能消耗为目的的governor。performance无论何时都以最高频率运行,因此无法抑制电能消耗。powersave由于降低运行频率,因此可以抑制电能消耗,但只有在进程几乎停止时才有效果。频率降低一般会导致运行时间增加,因此就会造成空闲时间(可以进入C状态的时间)减少,消耗的电能增加。

Linux的cpufreq子系统在/sys/devices/system/cpu/cpuN/cpufreq下提供了下列(见表6-12)与CPU性能相关的接口(N为CPU编号)。

P状态的使用方法 - 图5

P状态的使用方法 - 图6

使用cpufrequitls等就可以使上述接口更容易使用。下面是cpufrequtils中包含的cpufreq-info的例子。


cpufreq-info

cpufrequtils 005:cpufreq-info(C)Dominik Brodowski 2004-2006

Report errors and bugs to cpufreq@vger.kernel.org, please.

analyzing CPU 0:

driver:p4-clockmod

CPUs which need to switch frequency at the same time:0

hardware limits:317 MHz-2.53 GHz

available frequency steps:317 MHz,633 MHz,950 MHz,1.27 GHz,1.58 GHz,1.90 GHz,2.22 GHz,2.53 GHz

available cpufreq governors:ondemand, userspace, performance

current policy:frequency should be within 317 MHz and 2.53 GHz.

The governor"userspace"may decide which speed to use

within this range.

current CPU frequency is 2.22 GHz(asserted by call to hardware).

cpufreq stats:317 MHz:0.00%,633 MHz:0.00%,950 MHz:0.00%,1.27

GHz:0.00%,1.58 GHz:0.00%,1.90 GHz:0.00%,2.22 GHz:0.00%,2.53 GHz:0.00%(5)


在安装了cpufreq-stats内核模块的情况下,/sys/devices/system/cpu/cpuN/cpufreq/stats下还准备了下列接口,用于powertop等应用程序(N为CPU编号)。

P状态的使用方法 - 图7

ondemand中提供了下列接口(见表6-13),以便进行更加详细的调整。

P状态的使用方法 - 图8

使用ondemand governor时acpi-cpufreq的运行情况如下。

1.cpufreq_ondemand驱动程序将初始化时用来计算负载的函数输入到计时器。

2.cpufreq_ondemand驱动程序定期根据空闲时间测量系统负载,决定要改变的P状态。

-CPU使用率一旦超过up_threshold中指定的值,就将频率提高到scalling_max_freq。

-CPU使用率如果保持up_threshold-10以下的状态,就将频率逐渐降低到scalling_min_freq为止。

3.cpufreq驱动程序(acpi-cpufreq等)让CPU进入期望实现的P状态。

conservative中提供的接口如表6-14所示。

P状态的使用方法 - 图9

P状态的使用方法 - 图10

在使用服务器等系统中,有时想要抑制电力峰值但是不停止服务器。这种情况下可以使用P状态限制电力峰值。下面介绍能够方便地限制P状态的设置方法。cpuspeed服务中可以在/etc/sysconfig/cpuspeed中进行限制P状态的设置。下列是将P状态固定在800MHz的例子。


MAX_SPEED=800000

MIN_SPEED=800000


对/etc/sysconfig/cpuspeed进行编辑后,重新启动cpuspeed服务,设置就会发挥作用。在scalling_max_freq、scalling_min_freq中设置MAX_SPEED、MIN_SPEED。需要注意的是,如果删除/etc/sysconfig/cpuspeed中设置的值,则需要手动重新设置scalling_max_freq、scalling_min_freq等,或者重新启动操作系统。另外,如图6-3和图6-4所示,在可以使用GUI的环境中,gnome-applets数据包中包含的CPU频率测量监控器(CPU Frequency Scalling Monitor),这个小应用程序的使用也十分方便。

Intel®智能加速技术

powertop(参考Hack#50)是确认P状态的工具之一。但是通过powertop命令仅能显示P状态的额定频率。

下面是在Intel®Xeon®CPU E3-1225的机器(Sandy Bridge)上执行powertop时的输出内容。可以确认以1.60~3.11GHz运行时的情况。

P状态的使用方法 - 图11

图 6-3 添加CPU频率测量监控器小程序(monitor applet)

P状态的使用方法 - 图12

图 6-4 使用CPU频率测量监控器的例子

P状态的使用方法 - 图13

具有智能加速技术(Intel Turbo Boost Technology)的CPU自动以高于固定频率的频率运行。从内核2.6.38开始,内核源代码内都包含turbostat命令,可以确认智能加速的运行频率。

下载内核2.6.38,编译turbostat。


wget-t0-c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.tar.bz2

tar jxvf linux-2.6.38.tar.bz2


P状态的使用方法 - 图14

一直提高到3.39GHz,可以看出智能加速正在运行。turbostat的详细情况请参考man 8 turbostat。

[1]Data Center Manageability Interface。