cpufreqとpowerdを使ってサーバの熱対策と省エネを実現する

夏に向けて、ML115の温度対策をするために、cpufreqとpowerdを使ってCPU動作周波数の制御を試してみた。CPU動作周波数が下がれば、発熱も減ってハッピーになれるはず。
さて、うちのML115は、Opteron 1210を搭載している。AMDPowerNow!という名前でCPUの動作周波数制御機能を作ってるけど、このOpteronにもそれが搭載されてる。FreeBSDではdmesgを見ると、以下のように認識されていることがわかる。

CPU: Dual-Core AMD Opteron(tm) Processor 1210 (1800.01-MHz K8-class CPU)
  Origin = "AuthenticAMD"  Id = 0x40f33  Stepping = 3
  Features=0x178bfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,MMX,FXSR,SSE,SSE2,HTT>
  Features2=0x2001<SSE3,CX16>
  AMD Features=0xea500800<SYSCALL,NX,MMX+,FFXSR,RDTSCP,LM,3DNow!+,3DNow!>
  AMD Features2=0x1f<LAHF,CMP,SVM,ExtAPIC,CR8>
  Cores per package: 2
省略
cpu0: <ACPI CPU> on acpi0
powernow0: <PowerNow! K8> on cpu0
cpu1: <ACPI CPU> on acpi0
powernow1: <PowerNow! K8> on cpu1

さて、PowerNow!に対応していることはわかったけど、FreeBSDから制御できなきゃ意味がない。FreeBSDからCPU動作周波数を制御するために、cpufreqというフレームワークを使う。これを使ってCPU動作周波数を負荷によって動的に変更するのがpowerd。cpufreqはGENERIC kernelで有効にされてるので、powerdを起動すれば動作周波数変更の恩恵にすぐに与れる。
/etc/rc.confに以下を記述して、powerdを起動しよう。

powerd_enable="YES"

動作周波数は、sysctlで確認できる。1GHzと1.8GHzの2段階で切り替え可能、現在は1GHzで動作していることが分かる。あとはportsのbuildでもやって、1.8GHzに切り替わっていることを確認しておけばOK。

> sysctl dev.cpu | grep freq
dev.cpu.0.freq: 1000
dev.cpu.0.freq_levels: 1800/100000 1000/39776

暇なときはCPUにものんびり動いてもらって、発熱を抑えてエコに生活しよう。

参考