Linux上CPU调速

现在CPU尤其是笔记本用的多数有随时调节运行频率的功能,这样可以在不需要太多计算能力时降低频率运行,省电,减少发热。在Windows平台,微软已经把这件事搞好了,似乎不需要用户干预;但在Linux上还是要自己搞一搞的,也许有些发行版已经设好了。

我这个本是Debian sid,使用cpufreqd来调节,工作得还不错,2GHz的CPU,经常是以800MHz在运行,但上次编译Google gadgets时却发现它不会自动提升速度,编译很需要CPU的也不提。cpufreqd有个设置文件,/etc/cpufreqd.conf,里面设置很明了,大体就是设定几种规则,然后给定条件运行某个规则,比如接外接电源时就用Performance规则等等。但这次我怎么改这个设置,重启数次也没有反应。

后来检查到/etc/init.d下的cpufreqd脚本,才发现另外有一个cpufrequtils脚本,这个脚本也是自动运行,并且里面直接写了运行哪种方案,也就难怪cpufreqd不能自动调节了。

查了一下,这个cpufrequtils是个单独的包,可能是当初装cpufreqd时就随手装了。又Google了一下,发现它的主页,原来是个简化cpufreqd管理的工具。它自己把想用的规则直接写在脚本里,倒也简单省事,所以决定还是用它。里面主要这四行有用:

ENABLE="true"
GOVERNOR="ondemand"
MAX_SPEED="2000000"
MIN_SPEED="1067000"

意思很明确。重要的就是个governor,也就是管理CPU频率的方案,这个也是核心的不同模块,如下:

acpi-cpufreq
cpufreq_ondemand
cpufreq_userspace
cpufreq_conservative
cpufreq_powersave

这几个模块可以写在/etc/modules里面,然后系统现有哪些governor可用,可以用以下命令列出:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

意思也很明白。Ondemand就是按需分配。

问题在于如果只设了这个ondemand,没有设定最大最小速度,它的工作也不行,可能会一直停留在最低频率上,按道理这个事不应该发生,但我机器上确实如此。所以还必须设定最大最小频率。CPU可用的频率可用如下命令列出:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

比如这台的结果是:2000000 1600000 1333000 1067000 800000 。MHz为单位。把这个数字写到上面的脚本中即可。然后运行:

/etc/init.d/cpufrequtils restart

对CPU速度进行重新设定,工作就正常了。

另一个命令是cpufreq-info,可以列出当前CPU的全面信息,也可以使用。

用这个脚本,另外的cpufreqd.conf就没有用了,倒也省事。想用什么频率,就直接改这个脚本,算是个半自动步枪,比全自动化还可靠些。