|
|
使用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 details
- Default 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
- <m> AMD Mobile K6-2/K6-3 PowerNow!
- <m> AMD Mobile Athlon/Duron PowerNow!
- <m> AMD Opteron/Athlon64 PowerNow!
- <m> Cyrix MediaGX/NatSemi Geode Suspend Modulation
- <m> Intel Enhanced SpeedStep (deprecated)
- -*- Built-in tables for Banias CPUs
- <m> Intel Speedstep on ICH-M chipsets (ioport interface)
- <m> Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface)
- <m> Intel Pentium 4 clock modulation
- <m> nVidia nForce2 FSB changing
- <m> 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的电源管理指导 |
|