ปรับความถี่ซีพียูบนลินุกซ์ด้วย CPU Frequency Scaling

ลินุกซ์สนับสนุนการปรับความถี่การทำงานของซีพียูโดยใช้ CPU Frequency scaling support ซึ่งเหมาะกับคอมพิวเตอร์ใช้ซีพียูที่สนับสนุนการปรับความถี่ เช่น ซีพียูที่สนับสนุน Intel SpeedStep (P-III Tuaalatin), Intel Enhanced SpeedStep (Centrino), AMD PowerNow!, Transmeta LongRun (Crusoe) เป็นต้น การปรับความถี่จะทำได้ทันที โดยไม่ต้อง reboot เครื่อง จึงเหมาะกับคอมพิวเตอร์โน๊ตบุ๊คที่ต้องการประหยัดพลังงานเมื่อใช้แบตเตอรี่

คอนฟิกฯ ส่วนของเคอร์เนล

การใช้ CPU Frequency scaling ต้อง patch kernel source เพื่อให้เคอร์เนลสนับสนุนเสียก่อน แนะนำให้ใช้ stable kernel ตัวล่าสุด + ac patch ตัวล่าสุดสำหรับเคอร์เนลดังกล่าว

ส่วนที่ต้องคอนฟิกฯ ในเคอร์เนลมีดังนี้:

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
CONFIG_CPU_FREQ_PROC_INTF=y

#
# CPUFreq governors
#
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_24_API=y

และเลือก Driver ตัวที่ตรงกับซีพียู/ฮาร์ดแวร์ที่ใช้งานอยู่:

#
# CPUFreq processor drivers
#
CONFIG_X86_POWERNOW_K6=y สำหรับ mobile AMD K6-2+,  K6-3+
CONFIG_X86_POWERNOW_K7=y สำหรับ mobile AMD Athlon/Duron K7
CONFIG_ELAN_CPUFREQ=y สำหรับ AMD Elan SC400 / SC410
CONFIG_X86_LONGHAUL=y สำหรับ VIA Samuel/CyrixIII, Samuel/C3, Cyrix Ezra, Cyrix Ezra-T
CONFIG_X86_SPEEDSTEP_ICH=y สำหรับ mobile P-III (Coppermine), P-III-M (Tulaatin), P4-Ms
CONFIG_X86_SPEEDSTEP_CENTRINO สำหรับ Pentium M (Centrino)
CONFIG_X86_LONGRUN=y สำหรับ Transmeta Crusoe ที่สนับสนุน LongRun
CONFIG_X86_GX_SUSPMOD=y สำหรับ NatSemi Geode ที่สนับสนุน suspend modulation

จากนั้นคอมไพล์และติดตั้งเคอร์เนลใหม่ หลังจาก reboot แล้ว ข้อมูลของ frequency scaling จะปรากฏใน /proc/cpufreq

# cat /proc/cpufreq
          minimum CPU frequency  -  maximum CPU frequency  -  policy
CPU  0       731500 kHz ( 73 %)  -     997500 kHz (100 %)  -  performance

การปรับความถี่

หลังจากเคอร์เนลสนับสนุน CPU frequency scaling แล้ว การปรับความถี่สามารถทำได้โดยส่ง string redirect ไปที่ /proc/cpufreq โดยใช้ฟอร์แมตดังนี้

<CPUID>:<min freq>:<max freq>:<policy>

CPUID เป็นหมายเลขอ้างอิงซีพียู สำหรับเครื่องส่วนใหญ่ที่เป็น uniprocessor จะเป็น 0 เพราะมีซีพียูเพียงตัวเดียว (0 คือ ID ของซีพียูตัวแรกของระบบ) ความถี่กำหนดในหน่วย kHz .. policy กำหนดได้สองอย่างคือ เป็น performace เพื่อเลือกการทำงานเต็มประสิทธิภาพ หรือ powersave เพื่อเลือกการทำงานในโหมดประหยัดพลังงาน ตัวอย่างเช่น

echo -n "0:731500:997500:powersave" > /proc/cpufreq

เป็นการกำหนดให้ซีพียูตัวแรก ทำงานที่ความถี่ช่วง 731500 kHz (~ 733 MHz) ถึง 999750 (~ 1 GHz) ในโหมดประหยัดพลังงาน

ถ้าต้องการกำหนดความถี่เป็นเปอร์เซ็น สามารถทำได้โดยใช้ฟอร์แมตนี้:

<CPUID>:<min freq>%<max freq>%<policy>

เราสามารถดูความถี่ปัจจุบันของซีพียูได้จาก /proc/cpuinfo

# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 11
model name      : Intel(R) Pentium(R) III Mobile CPU      1000MHz
stepping        : 1
cpu MHz         : 733.272
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse
bogomips        : 1464.72

ปรับความถี่อัตโนมัติโดยใช้ cpufreqd

CPU Frequency scaling ในเคอร์เนลไม่ได้ควบคุม/ปรับความถี่หรือ power policy อัตโนมัติ การเพิ่ม CPU Frequency scaling support ในเคอร์เนลเป็นการ enable ให้เราปรับความถี่ได้เท่านั้น แต่จะปรับความถี่ เมื่อไหร่ อย่างไร ขึ้นอยู่กับผู้ใช้ ซึ่งอาจจะปรับความถี่เองด้วยวิธีการข้างต้น หรือ ใช้ CPU Frequency daemon เช่น cpufreqd, cpudyn เพื่อปรับความถี่ซีพียูตามเงื่อนไขโดยอัตโนมัติ

cpufreqd เป็น daemon ที่ตรวจเช็คสถานะต่่างๆ ของระบบ เช่น AC status, battery level, CPU workload, running application และปรับความถี่ power policy ให้อัตโนมัติตามเงื่อนไขที่กำหนดไว้ใน configuration file (/etc/cpufreqd.conf) การทำงานของ cpufreqd จึงจำเป็นต้องอาศัย Power Management support ในเคอร์เนล (เช่น APM, ACPI) เพื่อรายงานสถานะของระบบด้วย

ซอร์ส ของ cpufreqd สามารถดาวน์โหลดได้จาก http://cpufreqd.sourceforge.net extract, configure, make, make install เพื่อติดตั้ง

RPM สำหรับ LinuxTLE 5.5/Fedora Core 1 จะ release ในแผ่นติดตั้งของ LinuxTLE 5.5 หรือสามารถดาวน์โหลดได้จาก ftp://ftp.kitty.in.th/pub/TLE/5.5/kitty-tle