CentOS-網管小筆記 : CPU Frequency Hack

基於之前比賽的需求,所以 survey 過 Linux 底下如何 ad-hoc 動態調整 CPU 頻率。在普通 consumer 硬體架構下,超頻降頻早已不是什麼稀奇的事情,不過在伺服器上並且在 Linux 下作這件事情就不是這麼常見。主要原因伺服器在設計上本來就是以穩定為主,如果你需要更高的頻率,你應該是要更換高頻率的CPU。這也為什麼 Intel Server class 的 CPU 會有這麼多型號。並且伺服器設計上就是必須要以最高效能的方式運作,不過在一些特殊的情況來說,有時候最高頻率的並不是最 efficiency 使用電源。闢如你有大量的 CPU core 作 Multi Agent simulation,可想像的是 Cores 大部分的時間都在 exchange 資訊,而不是作 Compute , 所以提高頻率所增高的效率,並不有效。其實 OS 本身就已經自動調整頻率的功能,但這對於我來說並不足夠,因為調整等於是 unpredictable 是個 black box。由於當時比賽需要很精準的控制電量,並且確保所有程式都可在最有效的情況輸出,就需要有能手動控制頻率的技術。

  • 以下教學並不會為損壞你的設備負責,請確認自己了解以下指令的風險在繼續。
  • 以下這些指令都是 Linux 內建的,不過你會需要 root 權限。
  • 以下教學只適用於 Intel CPU

Know Your Equipment

首先必須了解自己的 CPU 型號,可以用下

> cat /proc/cpuinfo | grep 'model name' -m 1
  model name    : Intel(R) Xeon(R) CPU E5-2690 v3 @ 2.60GHz

適用於以下的指令的最少會需要 v1 以後的CPU ,也就是 Sandy Bridge-EP 以後的。

ACPI modules

再來我們要打入 ACPI 的 Kernel Modules,ACPI (Advanced Configuration and Power Interface) 提供Kernel 可以更 fine-grain 控制硬體電源,以及更精準的讀數。

> sudo modprobe acpi-cpufreq

若有以下資訊,有可能已經載入相對應的 Modules 。 ```perl

modprobe: ERROR: could not insert 'acpi_cpufreq': Device or resource busy ```

CPU Frequency Control

再來我們可以了解我們可以用的頻率有哪些

先到以下位址

> cd /sys/devices/system
> ls
  cpu0 cpu12 cpu16 cpu2 cpu23 cpu27 cpu30 cpu34 cpu38 cpu41 cpu45 cpu6 cpuidle modalias power cpu1 cpu13 cpu17 cpu20 cpu24 cpu28 cpu31 cpu35 cpu39 cpu42 cpu46 cpu7 intel_pstate offline present cpu10 cpu14 cpu18 cpu21 cpu25 cpu29 cpu32 cpu36 cpu4 cpu43 cpu47 cpu8 kernel_max online uevent cpu11 cpu15 cpu19 cpu22 cpu26 cpu3 cpu33  cpu37 cpu40 cpu44 cpu5 cpu9 microcode possible

這裡可以看到你可以控制所有的CPU , 這裡如果你有開啟Hyper-Threading ,可以看到 cpu 數目會變 double ,這裡我們先隨便跳一個cpu。

> cd cpu0/cpufreq/
> ls
  affected_cpus cpuinfo_max_freq cpuinfo_transition_latency scaling_available_governors scaling_governor scaling_min_freq cpuinfo_cur_freq  cpuinfo_min_freq related_cpus scaling_driver scaling_max_freq scaling_setspeed

幾個東西可查看

  • cpuinfo_min_freq : CPU 可以調整的最低頻率
  • cpuinfo_max_freq : CPU 可以調整的最高頻率

幾個比較重要的東西可以調

  • scaling_min_freq : CPU 運作下的最低頻率
  • scaling_max_freq : CPU 運作下的最高頻率

所以你可以藉由調整的上述兩個 upper bound 和 lower bound ,來設定 CPU 頻率的運作時候的範圍調法如下

> echo {欲調整的頻率} > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
example :
> echo 2000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq

輸完後可以再 cat 一次來確認修改完成。