- 论坛徽章:
- 0
|
这里说到的X86平台上的变频技术是指Enhanced Intel SpeedStep Technology(EIST),在现在的很多笔记本的BIOS里面可以找到SpeedStep或者EIST的选项,这就是SpeedStep。SpeedStep是Intel在CPU上加入的一种节能技术,通过降低CPU的频率来达到降低CPU的功耗的。这种技术在ACPI的规范里面被定义为P-state, 即Processor Performance State, 当系统在运行中,操作系统的电源管理模块(OSPM)应当根据系统的负载来调节CPU的频率,也就是说,当系统很忙的时候,OSPM应该让CPU工作在最高的频率上来达到最好的性能;而当系统空闲的时候,OSPM应该让CPU工作在最低的频率上来节省更多的能源。
到底SpeedStep能节省多少能源呢,下面是我的一台笔记本上的数据:
Frequency
Power
2400MHz
35W
1600Mhz
15W
800Mhz
12W
这里,2400Mhz是CPU的marked frequency,也就是默认的频率;而800Mhz是支持了SpeedStep后,CPU可以达到的最低频率,可以看出,SpeedStep技术让CPU在空闲的时候节省(35-12)=23W的电能。当然,不同的平台这些数据完全不同。
Intel的CPU早在PentiumⅢ的时候就加入了对SpeedStep技术的支持。但是,硬件的支持,不代表我们的系统就可以享受这一节能特性,这显然和操作系统是否支持有关。
这里只说OpenSolaris(本人对Solaris 10不感兴趣),大概在2007年7月份的时候,OpenSolaris在Build70里面加入了对SpeedStep技术的支持,也就是从那以后的版本都有SpeedStep技术的支持。但是这一支持是有平台的局限性的,确切的说,是对支持的CPU有局限性。需要解释一下,也就是我常被问到的问题,为什么windows和Linux上支持SpeedStep,但是Solaris上不支持呢?为什么CPU支持SpeedStep但是Solaris操作系统不支持呢?
让我们来看看频率的变化给Solaris的内核带来了怎样的影响。
首先,看过Solaris内核源码的应该知道,Solaris喜欢给事件打上时间戳,即调用gethrtime()函数来记住当前状态的时间,或者drv_usecwait的实现来等待一段时间,这个函数也依赖于gethrtime()。
在X86上,gethrtime就是读CPU里面的一个counter,然后转换为纳秒为单位来提供给用户。问题就出在了这个counter身上。这个计数器在Intel的CPU上称为Time-Stamp Counter(TSC),是一个64位的计数器,每一个处理器内部的时钟cycle,这个计数器就会加一。如果是1Ghz的处理器,这个counter每加1次就代表1纳秒过去了,那么如果是2Ghz的处理器,这个counter需要加2才是1纳秒。而counter加多少算1纳秒的校准机制是在系统启动的时候决定的。在运行的过程中每次校准非常昂贵而且也不符合实际。
可以看出,SpeedStep肯定是会改变频率的,那么处理器内部频率的变化会不会影响TSC呢?如果影响了,那么gethrtime()提供的纳秒级的时间戳就变得不准确,从而有可能给Solaris内核带来灾难性的后果;如果不影响,那么Solaris对SpeedStep的支持就毫无问题。
答案是部分CPU上的SpeedStep会影响TSC:
- Varietal TSC, TSC基于当前的处理器时钟,也就是如果处理器因为SpeedStep变慢了,那么TSC的数值代表的时间也随之加长了。Pentium M处理器 (family [06H], models [09H, 0DH]); Pentium 4以及志强处理器中(family [0FH], models [00H, 01H, or 02H]);和P6家族的处理器,TSC增加的频率都是会随着处理器的时钟变化而变化的
- Invarient TSC, TSC基于Marked frequency, 也就是默认的处理器时钟。在Pentium 4和志强处理器(family [0FH], models [03H and higher]); Core Solo and Core Duo处理器 (family [06H], model[0EH]); 志强处理器5100系列和Core 2 Duo处理器(family [06H], model [0FH]),TSC都不会随着SpeedStep的频率变化而变化。
所以,我们Solaris上SpeedStep的驱动里面也有这样的判断:
/*
* We only support family/model combinations which
* are P-state TSC invariant.
*/
if (!((family == 0xf && model >= 0x3) ||
(family == 0x6 && model >= 0xe))) {
return (B_FALSE);
}
也就是说,只有CPU的family和model型号不符合上面这个判断,Solaris才支持SpeedStep技术。
下面是几个FAQ:
1) Q:怎样确定Solaris是否支持SpeedStep技术?
A:答案如下
[aubrey-lab@~]kstat | grep supported_frequencies_Hz
supported_frequencies_Hz 2000000000:2333000000:2667000000
supported_frequencies_Hz 2000000000:2333000000:2667000000
supported_frequencies_Hz 2000000000:2333000000:2667000000
supported_frequencies_Hz 2000000000:2333000000:26670000002) Q:我的系统支持了SpeedStep,如何知道CPU当前是运行在那个频率上呢?
A:答案如下
[aubrey-lab@~]kstat | grep current_clock_Hz
current_clock_Hz 2667000000
current_clock_Hz 2667000000
current_clock_Hz 2667000000
current_clock_Hz 2667000000
3) Q:我的系统支持了SpeedStep,但是为什么即使是在空闲的时候,当前的处理器频率还是工作在最高的频率上呢:
A:这是因为CPU的电源管理模块在系统默认的配置下没有打开,在fix了很多bug以后,这一配置终于在Build94里面默认被打开,如果运行的是B94以前的版本,需要做如下配置
- 在系统文件"/etc/power.conf"里面加入或者修改如下内容
cpupm enable
cpu-threshold 15s- 修改完后,在超级用户下运行,"/usr/sbin/pmconfig",这个命令通知内核读取
"/etc/power.conf"里面的配置来更新操作系统的电源管理模块。4) Q: 我的系统不支持SpeedStep, kstat的supported_frequencies_Hz只有一个频率,为什么?
A: 首先检查CPU型号
[aubrey-lab@~]kstat | grep family | grep model
implementation x86 (chipid 0x0 GenuineIntel 6F4 family 6 model 15 step 4 clock 2667 MHz)
implementation x86 (chipid 0x3 GenuineIntel 6F4 family 6 model 15 step 4 clock 2667 MHz)
implementation x86 (chipid 0x0 GenuineIntel 6F4 family 6 model 15 step 4 clock 2667 MHz)
implementation x86 (chipid 0x3 GenuineIntel 6F4 family 6 model 15 step 4 clock 2667 MHz) 如果型号不支持,那就没辙;
如果型号支持,那么就去看看BIOS里面的SpeedStep或者EIST选项是否没有打开。
如果BIOS里面没有这些选项,那可能需要升级BIOS,注意,有风险,郑行!!
如果BIOS里面有这些选项,而且是enable的,那么就给我们报bug吧, 我们的网址是:
http://www.opensolaris.org/os/project/tesla/
最后需要说明的是,Intel以后的CPU都支持Invarient TSC,所以Solaris对今后的Intel平台的SpeedStep支持都没有问题;Solaris要想支持以前的平台,需要decouple内核以及驱动里面对TSC的依赖,这是个不小的工程,我们目前没有计划做这件事情。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/41699/showart_1160160.html |
|