PECI
是用于监测CPU
及芯片组
温度的一线总线(one-wire bus),全称是Platform Environment Control Interface
。它最主要的应用是监测CPU温度,最新版本的PECI接口还包括一些其他的功能。
Intel Processor的温控机制 #
在CPU中,通常每个CPU核心都有一个数字温度传感器。在PC平台下,处理器可以通过MSR
(Mode specific registers)获得处理器自身的温度、调节风扇转速,从而实现温度控制。在服务器
平台下,温度控制通常是由BMC
来做的,业务CPU本身没有办法控制服务器里的风扇转速。BMC直接或间接通过PECI总线获取到CPU的核心温度,再根据所读到的温度值来调整风扇的转速。
MSR方式读取CPU温度读取到的是即时温度,PECI方式读取到的是256ms时间窗内的平均温度。MSR方式是需要CPU处理C0状态才能读取。PECI方式在C0~C6均可以使用。
Intel Pentium M
开始在处理器中引入DTS(数字温度传感器)。温度传感器通常是每个CPU核心一个。
TM1 #
为了保护CPU不会在过热时被烧坏,从Pentium4
开始,处理器中又加入了一个温度监示器Thermal Monitor 1
,简称TM1
。TM1会监示数字温度传感器的读数,当读数高于阈值Tjmax
时,TM1会调节处理器时钟的占空比,以降低功耗,降低温度。这里所谓的调节时钟占空比与传统意义上的时钟占空比不同,这里调节的是时钟信号的开闭时间比例,比如说,它会在某一段时间内,37.5%的时间打开CPU时钟,让CPU工作,另62.5%的时间关闭CPU时钟,让CPU停止工作以降低功耗和温度。
TM2 #
TM2
是Pentium M
引入的,它提供了另一种降低CPU温度的办法。在CPU某个核心的温度超过Tjmax
时,它会尝试降低时钟频率和供电电压来降低功耗和温度。TM1和TM2是两个单独的机制,或以分别启用和禁用。Intel推荐两个机制同时使用。它们的启用和禁用是通过BIOS
设置IA32_MISC_ENABLE
这个模式寄存器的第3、13位来实现的。BIOS打开这两个机制后,OS和用户程序不可关闭。
温度阈值 #
Tjmax
是我们所知的第一个阈值,当CPU上任意一个核心的温度达到这个阈值时,CPU会产生一个PROCHOT#
信号(processor hot)。该信号可触发TM1和TM2。处理器时会通过调节时钟占空比、降低时钟频率和供电电压的方式来降低功耗和温度。产生PROCHOT#
信号的同时,温度监示器还会产生一个中断给CPU,其中断向量号通过LAPIC
和LVT
来设置。模式寄存器IA32_THERM_INTERRUPT
有两个位用于高温中断使能(温度超过Tjmax时产生中断)和低温中断使能(温度回到低于Tjmax的范围时产生中断)。
PROCHOT#
通过CPU的一个引脚拉出,并且可以连接在外设上,由外设来发生这个信号。比如说一个系统中有另一个设备的温度超过阈值,它可以拉低使能这个信号,从而使CPU也一起降温,从而降低机箱内的温度,制造一个更好的散热环境。
如果TM1和TM2启动后温度没能降低下来,并且继续升高到可能造成CPU物理损坏的温度时,核心会触发THERMTRIP#
信号,并且关闭CPU电源。
CPU硬件实现的温度控制机制是用于CPU自我保存的温控机制,当这些机制不足以降温时,CPU会断电,从而造成系统突然掉电,造成数据损失。因而一般要求BMC
在要以一定的周期读取CPU核心温度,根据温度调整风扇转速,并且当温度超过Tjmax-10
时,让风扇全速转动。
相关MSR #
IA32_THERM_INTERRUPT #
IA32_THERM_INTERRUPT
寄存的地址为0x19B。BIOS通过IA32_THERM_INTERRUPT模式寄存器使能温度相关的中断,其各字段定义如下:
表格 1 IA32_THERM_INTERRUPT 0x19B
位 | 描述 |
---|---|
0 | High temperature interrupt enable |
1 | Low temperature interrupt enable |
2 | PROCHOT# interrupt enable |
3 | FORCEPR# interrupt enable |
4 | Critical Temperature interrupt enable |
7:5 | reserved |
14:8 | Threshold 1 value |
15 | Threshold 1 int enable |
22:16 | Threshold 2 value |
23 | Threshold 2 int enable |
63:24 | reserved |
在一个实际系统读到的该寄存器的值为:
sudo modprobe msr
sudo rdmsr –p 0 0x19B
3
IA32_TEMPERATURE_TARGET #
IA32_TEMPERATURE_TARGET
模式寄存器的地址为0x1A2。该模式寄存器是只读的。
表格 2 IA32_TEMPERATURE_TARGET模式寄存器
位 | 描述 |
---|---|
23:16 | 温度目标,单为是摄氏度,当达到这个温度时触发TM1和TM2,产生PROCHOT#信号。 |
在一个实际系统读到的该寄存器的值为:
sudo modprobe msr
sudo rdmsr –p 0 0x1A2
0x5B08
0x5B=91摄氏度
嵌入汇编方式读取MSR:
__asm____volatile__(“movl $0x1A2, %%ecx\n\trdmsr\n\t”)
PECI接口 #
BMC
获取CPU核心温度有两种途径:
- 通过PECI总线直接从CPU上获取温度数据
- 通过IPMI协议从南桥上的ME上获取CPU核心温度
在第二种情况下,ME需要通过PECI接口从CPU上获取温度。由于PECI的一线总线是intel的私有总线协议,很多BMC厂商并没有办法集成支持PECI接口协议的硬件,因而途径2是获取CPU核心温度的主流途径。
PECI规范 #
PECI是一个私有的协议,不得到Intel授权无从得知协议的细节。PECI规范到现在有三个主要版本:1.1、2.0和3.0。PECI 1.1支持最简单的温度监示,PECI2.0则支持更多的如读取MSR等特性,PECI 3.0进一步支持PCIe总线配置空间的读取。
表格 3 PECI 1.1和2.0比较
版本 | 1.1 | 2.0 |
---|---|---|
特性 | 温度监示 | 温度监示 |
Ping() | Ping() | |
GetTemp() | GetTemp() | |
GetDib() | GetDib() | |
访问CPU内存 | ||
BIST | ||
Memory throttling相关 |
下图是PECI 3.0
支持的命令列表:
表格 4 PECI 3.0支持的命令列表
现代服务器系统中,BMC
通常不直接使用PECI
接口,而是通过南桥上的ManagementEngine
来间接使用PECI
接口。Management Engine
是南桥上的一个嵌入式微控制器,它可以通过南桥上的PECI主控器访问CPU上的PECI从设备。同时,ME还实现了一些IPMI
命令,可以让BMC通过SMLink
间接使用这个PECI主控制器。这样的系统架构如下图所示:
所有的IPMI命令可以参考《IntelIntelligent Power Node Manager 2.0 External Interface Specification》的2.9节: IPMI OEMPECI Proxy Commands。