如何解决CPU过热100度自动关机

来源:互联网 发布:java 获取命令行参数 编辑:程序博客网 时间:2024/05/04 00:01

使用gentoo的,和重新编译过内核的Linux朋友可能会遇到这样的问题,当你正在编译某个大型软件
(比如gcc),CPU满负荷运转半个小时左右,Linux忽然会提示类似如下的信息:

Critical temperature reached (100 C), shutting down

然后就开始进入init脚本的关机流程。于是,稍微大一些的软件就无法编译了。
我也遇到了这个问题,并被困扰了一个半月,在绕了一些圈子以后,终于让我找到了问题所在和解决的。
首先,这个问题和内核的acpi模块以及acpid守护进程无关,和processer.ko、fan.ko、thermal.ko、button.ko无关,和/proc/acpi/目录下的文件无关,和/sys/devices/system/cpu/目录下的文件无关。
这种过热关机的问题只和
Power Management Options --->CPU Frequency Scaling --->

有关,CPU Frequency Scaling是kernel中对CPU自动降频功能的支持。
[*] CPU Frequency scaling [ ] Enable CPUfreq debugging <*> CPU frequency translation statistics [*] CPU frequency translation statistics detailsDefault CPUFreq governor (ondemand) --->-*- 'performance' governor <*> 'powersave' governor <*> 'userspace' governor for userspace frequency scaling<*> 'ondemand' cpufreq policy governor <*> 'conservative' cpufreq governor *** CPUFreq processor drivers *** <*> ACPI Processor P-States driver AMD Mobile K6-2/K6-3 PowerNow! AMD Mobile Athlon/Duron PowerNow! AMD Opteron/Athlon64 PowerNow! Cyrix MediaGX/NatSemi Geode Suspend Modulation Intel Enhanced SpeedStep (deprecated) -*- Built-in tables for Banias CPUs Intel Speedstep on ICH-M chipsets (ioport interface) Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface) Intel Pentium 4 clock modulation nVidia nForce2 FSB changing Transmeta LongRun

内核中的CPU Frequency Scaling功能基本上可以分为三个部分:基本选项,governor(策略)模块和驱动模块。
开头的四行是四项基本选项,
[*] CPU Frequency scaling表示启用CPU降频功能
[ ] Enable CPUfreq debugging 表示启用该功能的debug功能
<*> CPU frequency translation statistics表示启用通过sysfs查看CPU降频状态的功能
[*] CPU frequency translation statistics details表示启动上面那个功能的详细信息;
“Default CPUFreq governor (ondemand) --->”这一行及其以下的部分是governor(策略)模块,目前共有'performance' 'powersave''userspace''ondemand''conservative'五个降频策略模块,其中:
'performance':高性能,就是CPU一直坚持使用最高频率工作,
'powersave':节能,CPU一直坚持使用最低频率工作,
'userspace':用户空间程序,CPU的频率根据用户空间的程序,通过/sys文件系统进行设置,
'ondemand':按需动态,CPU频率根据实际运行情况动态调整,
'conservative':保守动态,CPU频率根据实际运行情况,保守的动态调整;
*** CPUFreq processor drivers ***以下的部分是针对这种CPU的驱动模块。我的Intel T2330使用的是ACPI Processor P-States driver。
以上是kernel对于CPU降频功能的支持。前面的列表可以作为大家配置CPU Frequency Scaling时的参考,对于四项基本选项除debugging按需y之,其余的坚决y之;五个governor建议y之,至少也要m之;驱动模块,系统在用的CPU对应的驱动模块y之或m之,其余的m之或n之。
插曲:内核配置的YNM
Linux的内核配置包含很多选项。对于每一个配置选项,用户可以回答y、m或n。其中y表示将相应特性的支持或设备驱动程序编译进内 核;m表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;n表示内核不编译包含相应特性或驱动程序。
可以参看这篇文章如何编译Linux的内核
如果编译内核的时候没有启用CPU自动降频的支持、或者没有编译需要的驱动模块和governor(策略)模块、或者系统启动的时候没有加载合适的降频驱动模块和governor(策略)模块,或者没有设置合适的当前governor(策略)(比如设置的是performance governor),如果硬件的降温设施不够强大,CPU便会逐渐过热,当达到一个阈值时系统为了自我保护,开始自动关机。这便是困扰了我一个半月的自动关机的原因。
了解了原理,解决办法就很简单了。正确配置内核中的CPU Frequency Scaling功能,并配置cpu-frequtils软件设置合适的governor,就可以解决问题了。
#cpufreq-set -g ondemand -c 0

更多关于计算机电源管理和CPU降频的消息,可参考gentoo的电源管理指导

==============2014年9月30日增加===========================

想不到这帖子关注的人不少。需要说明一下,通过将CPUfreq的governor设置成ondemand来避免CPU达到100 C自动关机的方法,只是针对成品系统已经存在的散热不良的设计,避免系统停机的“无可奈何”的方法。避免CPU达到100 C自动关机的根本解决途径是增强散热系统的能力,而不是CPUfreq。同样把CPUfreq的governor设置成performance就是很有效的测试散热系统设计是否达标的手段,优秀的系统会稳定在60 C,即使达到100 C的时候也会增大fan的转速,使温度平衡稳定,不会导致关机。很多旗舰本、铝镁商务本都满足这样的设计准线。

原创粉丝点击