ubuntu18.04下cpu睿頻模式設定

語言: CN / TW / HK

由於有一臺老筆記本用來充當伺服器,自然會在上面跑些業務。可感覺CPU不給力,於是研究了一下,發現CPU睿頻有挺多有趣的點,遂逐一試了一下,記錄下來。

 

首先就是檢視cpu資訊,傳統的檢視方法有兩種,一種是lscpu,另一種則是檢視/proc/cpuinfo檔案資訊。

但實際上還可以通過sysfs檢視cpu主頻,即檢視/sys/devices/system/cpu/cpu0/cpufreq目錄下的檔案獲得cpu資訊。若該目錄為空,則需要手動apt安裝cpufrequtils軟體包。

cpuinfo_max_freq cpuinfo_min_freq 代表cpu支援的最大、最小頻率
scaling_available_governors 可供軟體選擇的頻率調節策略
scaling_governor 當前選擇的策略
scaling_max_freq scaling_min_freq 軟體調節時的最大、最小頻率
scaling_cur_freq 是軟體當前指定的頻率
scaling_driver 調節頻率的驅動 (當前為intel_pstate)

注意/sys/devices/system/cpu目錄下有cpu0, cpu1, cpu2, cpu3四個資料夾,對應本機上的4個核心(實際上是2核4執行緒)。

對於現代 Intel CPU,將使用 pstate 功率驅動程式,而非下列其他驅動程式。此驅動程式的優先順序高於其他驅動程式,並編入核心(而非編譯為模組)。此驅動程式將自動用於 Sandy Bridge(以及更新的 CPU)。如果在使用這個驅動的時候遇到問題,建議您在 Grub 的核心引數中將其禁用(即修改 /etc/default/grub 檔案,在 GRUB_CMDLINE_LINUX_DEFAULT= 後新增 intel_pstate=disable)。您可以使用與此驅動程式配套的使用者空間工具,但這些工具不受您的控制。

儘管上述 P State 行為會受到 /sys/devices/system/cpu/intel_pstate 影響,例如:可以通過 # echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo關閉 Intel 睿頻加速,從而降低 CPU 的溫度。

對於現代 Intel CPU,Linux Thermal Daemon 也提供了一些其他的控制方法(例如 thermald),它們可以通過 P-state、T-state 或 Intel 節能驅動程式來主動控制系統溫度。thermald 也適用於較老的 Intel CPU。如果最新版本的驅動程式不可用,那麼守護程序會還原為 x86 MSR (Model Specific Register),由 Linux“cpufreq 子系統”來控制系統冷卻。

為了關閉intel_pstate,可在/etc/default/grub檔案中找到GRUB_CMDLINE_LINUX_DEFAULT,在後面加上"intel_pstate=disable",然後執行sudo update-grub。

 

安裝cpufrequtils之後,可執行cpufreq-info檢視CPU頻率資訊。

接下來即可使用如下指令指定cpu頻率模式

sudo cpufreq-set -g powersave
sudo cpufreq-set -d 1800m -u 2700m   ## 適用模式為powersave|ondemand|conservative|performance
sudo cpufreq-set -f {1800m~2700m}    ## 適用模式為userspace

使用上述方式設定後,重啟電腦又會回到預設值。為了讓該設定長久生效,需安裝sysfsutils,然後編輯/etc/sysfs.conf,在其中加入如下語句(有多少cpu就加多少行)

devices/system/cpu/cpu0/cpufreq/scaling_governor = performance
devices/system/cpu/cpu1/cpufreq/scaling_governor = performance
devices/system/cpu/cpu2/cpufreq/scaling_governor = performance
devices/system/cpu/cpu3/cpufreq/scaling_governor = performance

 

此外,檢視和設定cpu頻率還可以使用cpupower工具,該工具需要手動安裝linux-tools-common和linux-tools-generic

sudo apt-get install linux-tools-common linux-tools-generic

安裝完成之後可以用cpupower monitor指令檢視cpu資訊。

紅框中即為cpu頻率。也可採用如下指令檢視cpu資訊。

cpupower -c all frequency-info

如果要設定CPU效能模式,可用如下指令設定。

cpupower -c all frequency-set -g performance    ## 設定為效能模式
cpupower -c all frequency-set -g powersave      ## 設定為節能模式

 

如果想使每個核心執行在不同的頻率,需要注意以下問題:

cpufreq提供的很多功能並不被Hardware或者Kernel所支援,所以通過cpufreq設定的功能不一定會按照預期執行。例如,如果利用cpufreq為每個cpu設定單獨的執行的頻率,現實中在超執行緒的系統,兩個CPUs可能會繫結在一起,所以必須有相同的頻率。

Intel P-states實際上是提供了一個frequency-voltage對,通過降低cpu執行的電壓來降低cpu的執行頻率。這些frequency-voltage對是離散的,可能與cpufreq提供的可選頻率有出入。

對於intel的cpu,當前消費級別的uncore(如i系),只支援設定唯一一個時鐘頻率。然後是伺服器級的uncore(如E系),雖然支援每個核心不同頻率,但是你一旦指定他們執行在不同的頻率,uncore中功耗控制單元(PCU)可能會再次改寫你的請求,因為PCU可能認為你的設定不合理。

通過修改MSR IA32_PERF_CTL暫存器貌似可以要求每個核心執行在不同頻率,但是這並不意味著硬體會響應你的請求。

通過設定不同核的電壓,間接改變核心的執行頻率,這一思路受限於很少系統是有與核數量相同的電源來提供執行在不同電壓上。並且在Haswell架構之前,頻率和電壓是繫結的,一起寫入MSR IA32_PERF_CTL。Haswell 提供了 on-chip voltage regulators ,其允許給不同的核心不同的頻率。但這也不意味著硬體會響應你的請求(因為PCU的存在)。

PCU有最終的決定權,這部分詳細可以去看 Uncore Performance Monitoring Manuals for the various Xeon E5 products

注意以上幾種檢視cpu頻率的方式顯示的結果會有所差別,但具體哪個比較準確,我也不知道。

 

最後,可以通過top檢視cpu負載情況,

其中紅框中代表1分鐘,5分鐘,15分鐘的系統平均負載情況。也可通過uptime指令檢視,

這裡有必要解釋一下平均負載的意思。

系統平均負載:是處於可執行或不可中斷狀態的平均程序數。

可執行程序:使用 CPU 或等待使用 CPU 的程序

不可中斷狀態程序:正在等待某些 IO 訪問,一般是和硬體互動,不可被打斷(不可被打斷的原因是為了保護系統資料一致,防止資料讀取錯誤)

 

vmstat可用於檢視系統記憶體,cpu上下文切換和中斷次數。(引數1代表每隔1秒輸出一次)

其中cs為每秒的上下文切換次數;in為每秒的中斷次數;r表示就緒佇列長度,正在執行或等待 CPU 的程序;b表示不可中斷睡眠狀態的程序數,例如正在和硬體互動。

 

taskset可將程序指定cpu執行。
-p, 設定一個已存在的pid,而不是重新開啟一個新任務
-c, 指定一個處理,可以指定多個,以逗號分隔,也可指定範圍,如:2,4,5,6-8。
例如如下語句將程序13290切換到cpu3上。

taskset -cp 3 13290

以下語句則將任務執行在cpu0,cpu2和cpu3上。

taskset -c 0,2-3 tar jcf test.tar.bz2 test

 

nice則可以指定程式執行的優先順序,最高為-20,最低為19,常規程式為0。以下指令指定程式以低優先順序10執行。

nice -n 10 tar zcf test.tar.gz test

若要調整已經執行的程式優先順序,則需要用renice,例如下面語句將程序13348的優先順序調整為8

renice 8 13348

 

ulimit可以限制當前shell及其派生的子程序的cpu執行時間,因此可在指令碼中使用使得指令碼執行時間受限。但這樣做可能導致程式無法順利執行完。

#!/bin/bash

ulimit -SHt 100
tar zcvf test.tar.gz test

 

為了排查cpu負載情況,可安裝stress工具對cpu進行壓力測試,同時利用perf進行效能分析。這部分內容比較多,以後再詳細介紹。