cpufreq變頻子系統

早在2.6內核之初,linux就已經開始支持變頻節能技術,實現了一個cpufreq內核子系統來兼容市面上的變頻CPU技術。該子系統引入了governor和driver的概念,如下圖:

    

    

     cpufreq子系統實現了策略和機制分離的設計架構。

      CPU-specific drivers(又稱爲scaling_driver),它是具體的變頻機制實現,如intel爲speedstep-centrio或最新的ACPI P-states驅動;所用驅動的查看命令爲:cat /sys/devices/system/cpu/cpuXXX/cpufreq/scaling_driver

 

     governor是一個CPU平臺無關的管理層,實現一個CPU頻率策略選擇,在內核中共實現了5種,當前使用的情況,可通過如下命令查看: 

        cat /sys/devices/system/cpu/cpu/cpufreq/scaling_governor

     

     可在menuconfig中配置:CONFIG_CPU_FREQ,CONFIG_CPU_FREQ_GOV_PERFORMANCE, CONFIG_CPU_FREQ_GOV_POWERSAVE, CONFIG_CPU_FREQ_GOV_USERSPACE, CONFIG_CPU_FREQ_GOV_ONDEMAND, CONFIG_CPU_FREQ_GOV_CONSERVATIVE來選擇是否開啓cpufreq模塊,以及選擇何種governor,當然也可以根據自己的CPU來選擇相應的scaling driver.

 

a. /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq實現的是當前cpu的運行頻率,開啓變頻功能的時候可能會不停的變,其值是通過scaling_driver直接讀寫CPU的頻率寄存器,在intel的xeon上是讀取MSR_IA32_PERF_STATUS寄存器獲得的

b./sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq是governor使用的頻率即決策出來的頻率,最終需要調用scaling driver來設置它爲CPU實際的工作頻率,因此與cpuinfo_cur_freq存在一個時間差,但最終是同一個值

c./proc/cpuinfo中顯示的頻率值和scaling_cur_freq是一致的

 

內核編譯階段可以選擇系統默認的governor,也可在linux shell下動態設置當前的governor爲performance(每個CPU都需要設置),這樣每個核都會穩定工作在最高頻率:

echo performance > /sys/devices/system/cpu/cpu/cpufreq/scaling_governor (n0到N-1,N爲系統中的CPU個數);比如在某些支持TurboMode技術的Intel處理器上選擇這個governor可以進一步提高性能。

 

如果想設定某一箇中間的固定頻率可以選用userspace的governor:
1)echo userspace > /sys/devices/system/cpu/cpu/cpufreq/scaling_governor(所有CPU都要改)。

2) 1)步驟完成後,在cpufreq下會出現一個scaling_setspeed,直接把頻率echo進去就可以了(所有CPU都要改)。
  cat  /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies,可以查看可支持的頻率。

    userspace一般配合用戶態daemon程序使用,如上圖中的cpuspeed程序,可以根據cpu的當前使用率來動態調整cpu的當前頻率(userspace可通過scaling_setspeed文件設置),試圖達到最高的performance/watt。

 

    同一時間不同核的頻率CPU硬件會保證是相同的,變頻功能的開啓除了內核配置外,還需要BIOS開啓變頻選項。

 

    當出現性能較差問題而百思不得其解的時候,你可以關注一下cpufreq,或許就是你的問題原因所在
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章