几天前,我服务了几年NUC计算机开始不时自动进入S4休眠,特别是当视频出现在网页上时,过一段时间就会开始休眠。按下电源键从休眠中恢复时,映入眼帘的丑陋黑底白字提示我发生了什么:机器刚刚发生温度,进入Critical状态。也许电脑小白会立刻陷入恐慌,不知道发生了什么,但作为BIOS我立刻明白了老炮发生了什么:因为CPU温度太高,ACPI的_CRT事件被触发,操作系统进行了保护性休眠。(什么是_CRT,阅读本文: 老狼:CPU风扇停止后会发生什么?CPU为什么不烧? ) 既然你知道原因,就开始解决问题。我先用测温软件检测一下CPU普通负载和高负载温度下各核心。然后打开机器,用皮老虎面对它NUC进气口、主板风扇等部位统一吹风,再次打开测温软件,发现平均温度降低10度。解决问题有多简单!今天,我将介绍我经常使用的温度测量软件。同时,本着专栏授人以鱼不如授人以渔的精神,我将如何普及温度测量软件CPU温度的。 测温软件简单可靠:CoreTemp 很多同学用 NZXT's CAM和 AIDA在我看来,有些鸡用牛刀杀鸡。以下是一个简单的小程序:CoreTemp:
编辑
CoreTemp界面
1MB多一点的size,可以提供足够的信息。界面和名字CPU-Z有些类似,简单,但信息丰富。更重要的是TDP、Power、TjMax每个核心的温度,包括最小值和最大值。这个更重要,你可以在后台打开一段时间,运行一些折磨程序,看看最高温度能达到多少。 下载安装后,我过热了NUC上打开,是这样:
编辑
添加图片注释不得超过 140 字(可选)
这里要注意我特别标注的两个值:我的主板BIOS设置的TjMax值为100度,即超过100度,PROCHOT#将使能,将开始降频;而我的核心2在我几乎什么都没做的情况下,最高温度已经达到100度,已经开始降频。 那么这个TjMax这是什么意思?这个软件是如何获得每个核心的温度的? CPU内核测温原理 Intel在Pentium Ⅱ和之后的CPU中间植入热敏二极管(Thermal Diode)核心温度的直接测量创造了半导体温度测量技术的先例,术语称为DTS(数字温度传感器,digital thermal sensor)。同时,是的CPU温度控制电路内部集成(Thermal Control Circuit,TCC),温度控制功能由其自身执行。在DTS温度超过CPU额定核心的最高温度(TjMAX,maximum junction temperature)时会引发CPU减慢冷却措施CPU执行速度,直至关机。 CPU工作温度为-50°C到110°C之间。在-50°C以下,CPU工作不稳定。在110°C以上,CPU有烧毁的风险。因为CPU内部设备的热容不同,膨胀系数也不同CPU内部设备存在裂缝、虚焊等风险。实际上CPU内部传感器将继续向前移动CPU这些传感器不仅具有最高值,而且具有最高值 最低值 。差异保持不变,但中位线可以调整。就像滑动窗一样,随时监控CPU如果各种温度异常,超出范围迫关闭CPU。这个窗口大致是-35°C到110°C之间。因为DTS的值只有一个字节,我们就以TjMax作为中线,DTS值是相对的TjMax的差值(Offset)。所以这个DTS软件是怎么读出来的? 通过内核温度MSR可读取寄存器。在x86编程圣经Intel的x86 SDM的2.1节,MSR 0x19C就可以读到DTS的值:
编辑
添加图片注释不得超过 140 字(可选)
注意两点:
-
这个值是相对的TjMAX的差值(Offset),先通过另一个MSR读到TjMAX将值计算成摄氏度。
-
这个MSR是CPU中的PCU读取每个核心(Core)的DTS值,然后反映到MSR也就是说,这个MSR作用域是每个内核:HT两个线程共享相同MSR,各个内核这个MSR读取值不同。
结语 不但是CoreTemp,大多数测温软件都是这样读取的CPU核心温度。最后,我给你一个思考问题:我们现在知道每个核心DTS温度可以通过MSR读取是一组值;我们也知道系统温度控制系统的许多策略的触发温度是一个值,那么该值与该值和系统其他部分的温度有什么关系呢?请留下评论进行讨论。