PEPC代表“功率,能量和性能配置器”。這是用於配置CPU電源管理功能的命令行工具。
重要的是:這是用於調試和研究目的的工具。它需要根本權限,並且必須僅在孤立的實驗室環境中而不是生產中使用。
Linux工具有許多用於在Linux中配置電源管理的工具,該小節試圖解釋為什麼我們創建了另一個。
我們正在做很多與功率和性能有關的工作,例如使用Wult測量C態延遲,運行各種工作負載,並使用統計數據收集功率和性能統計。我們通常需要配置系統的各種功率和性能方面,例如啟用或禁用C型,限制CPU或UNCORE頻率,調整硬件諸如C1降級之類的硬件等等。
在創建“ PEPC”之前,我們必須使用許多不同的工具,例如“ cpupower”或“ lscpu”,請記住各種旋鈕的sysfs路徑,例如禁用C狀態的路徑。這很困難且容易出錯。這對我們來說還不夠靈活。例如,僅針對一個CPU模塊禁用C1是一項艱鉅的任務,因為必須首先找出該模塊中的CPU編號是什麼,然後在每個CPU上禁用C1。最後,許多硬件功能(例如C1降級)需要了解MSR寄存器以及要切換的位號。 “ WRMSR”和“ RDMSR”是有用的工具,但是它們不太容易,我們可以定期使用。
我們創建了“ PEPC”,以使功率和性能配置任務更加容易。使用PEPC,我們不必記住SYSFS路徑和平台特定的MSR(特定於模型的寄存器)編號。該工具具有靈活性,支持許多CPU模型,結構良好,還為其他Python項目提供了Python API。
PEPC支持發現和配置以下功能。
某些功能是獨立的,但有些是特定於硬件的。
注意,雖然可以通過OS軟件包獲得“ PEPC”,但它們通常不提供最新版本。使用“ PIP”安裝方法獲取最新的“ PEPC”版本。
“ PEPC”可在Fedora 38和39上找到。要安裝“ PEPC”,請運行
sudo dnf install pepc
Fedora軟件包由AliErdinçKöroğ[email protected]維護。
如果Fedora 37或以上的Fedora,請使用“ PIP”安裝方法。但是通過運行安裝依賴項
sudo dnf install -y rsync openssl-devel util-linux procps-ng
sudo dnf install -y python3-colorama python3-paramiko python3-argcomplete
“ PEPC”可通過“ Epel”存儲庫提供CentOS 9流。這是添加“ Epel”並安裝“ PEPC”的方法。
sudo dnf install epel-release
sudo dnf install pepc
Epel軟件包由AliErdinçKöroğ[email protected]維護。
我們不提供Ubuntu/Debian軟件包,因此您需要使用“ PIP”安裝方法。但是,安裝以下依賴項。
sudo apt install -y rsync libssl-dev util-linux procps python3 git
sudo apt install -y python3-pip python3-colorama python3-paramiko python3-argcomplete
運行以下命令:
sudo pip3 install --upgrade git+https://github.com/intel/pepc.git@release
此命令將從GIT存儲庫的“發行版”分支下載“ PEPC”,並將其安裝到系統中。
另一種方法是首先克隆git存儲庫並運行
git clone https://github.com/intel/pepc.git --branch release pepc
cd pepc
pip3 install --upgrade .
請注意,在許多情況下,必須使用Superuser(root)特權運行“ PEPC”,如果您使用'pip3'的' - 用戶'選項安裝它,它將“開箱即用”。這就是為什麼我們不建議使用“ - 用戶”的原因。
您還可以通過克隆存儲庫並運行幾個命令來創建此工具的獨立版本。以下是一個示例。您可能需要在其中調整'#! /usr/bin/python3'shebang。
首先,請確保以下命令打印“良好”。它驗證了您的“/usr/bin/python3”版本大於3.8:
/usr/bin/python3 -c 'import sys; ver=sys.version_info;
print("Good") if ver.major>2 and ver.minor>7 else print("Bad")'
創建獨立版本的“ PEPC”。
git clone https://github.com/intel/pepc.git --branch release pepc
cd pepc
echo '#!/usr/bin/python3' > pepc.standalone
git archive --format zip HEAD >> pepc.standalone
chmod ug+x pepc.standalone
這將創建“ pepc.standalone”文件,您可以在任何地方重命名並複制。它將用作獨立計劃。
“ PEPC”具有TAB完成支持,但這僅在定義某些環境變量的情況下才起作用。以下命令將做到這一點:
eval "$(register-python-argcomplete pepc)"
您可以將此行放入您的'.bashrc'文件中,以便默認啟用“ PEPC”選項卡的完成。
$ pepc pstates info
Source: Linux sysfs file-system
- Min. CPU frequency: '1.2GHz' for CPUs 0-87 (all CPUs)
- Max. CPU frequency: '3.6GHz' for CPUs 0-87 (all CPUs)
- Min. supported CPU frequency: '1.2GHz' for CPUs 0-87 (all CPUs)
- Max. supported CPU frequency: '3.6GHz' for CPUs 0-87 (all CPUs)
- Base CPU frequency: '2.2GHz' for CPUs 0-87 (all CPUs)
- Turbo: 'on' for CPUs 0-87 (all CPUs)
- Min. uncore frequency: '1.2GHz' for CPUs 0-87 (all CPUs)
- Max. uncore frequency: '2.8GHz' for CPUs 0-87 (all CPUs)
- Min. supported uncore frequency: '1.2GHz' for CPUs 0-87 (all CPUs)
- Max. supported uncore frequency: '2.8GHz' for CPUs 0-87 (all CPUs)
- EPB: '7' for CPUs 0-87 (all CPUs)
- CPU frequency driver: intel_pstate
- Operation mode of 'intel_pstate' driver: 'passive' for CPUs 0-87 (all CPUs)
- CPU frequency governor: 'schedutil' for CPUs 0-87 (all CPUs)
- Available CPU frequency governors: conservative, ondemand, userspace, powersave, performance, schedutil
Source: Model Specific Register (MSR)
- Bus clock speed: '100MHz' for CPUs 0-87 (all CPUs)
- Min. CPU operating frequency: '800MHz' for CPUs 0-87 (all CPUs)
- Max. CPU efficiency frequency: '1.2GHz' for CPUs 0-87 (all CPUs)
- Max. CPU turbo frequency: '3.6GHz' for CPUs 0-87 (all CPUs)
- EPB: '7' for CPUs 0-87 (all CPUs)
$ pepc pstates info --base-freq --driver
Base CPU frequency: '2.2GHz' for CPUs 0-87 (all CPUs)
CPU frequency driver: intel_pstate
對於所有CPU,將CPU頻率重新排列至[1.5GHz,2GHz]。
$ pepc pstates config --min-freq 1.5GHz --max-freq 2GHz
Min. CPU frequency: set to '1.5GHz' for CPUs 0-87 (all CPUs)
Max. CPU frequency: set to '2GHz' for CPUs 0-87 (all CPUs)
驗證它。
$ pepc pstates info --min-freq --max-freq
Min. CPU frequency: '1.5GHz' for CPUs 0-87 (all CPUs)
Max. CPU frequency: '2GHz' for CPUs 0-87 (all CPUs)
鎖定CPU頻率為基本頻率(HFM),用於包裝1的核心0和4中的所有CPU。
pepc pstates config --min-freq base --max-freq base --packages 1 --cores 0,4
Min. CPU frequency: set to '2.2GHz' for CPUs 1,9,45,53
Max. CPU frequency: set to '2.2GHz' for CPUs 1,9,45,53
驗證它。
$ pepc pstates info --min-freq --max-freq
Min. CPU frequency: '1.5GHz' for CPUs 0,2-8,10-44,46-52,54-87
Min. CPU frequency: '2.2GHz' for CPUs 1,9,45,53
Max. CPU frequency: '2GHz' for CPUs 0,2-8,10-44,46-52,54-87
Max. CPU frequency: '2.2GHz' for CPUs 1,9,45,53
在所有CPU上解鎖CPU頻率。
$ pepc pstates config --min-freq min --max-freq max
Min. CPU frequency: set to '1.2GHz' for CPUs 0-87 (all CPUs)
Max. CPU frequency: set to '3.6GHz' for CPUs 0-87 (all CPUs)
驗證它。
$ pepc pstates info --min-freq --max-freq
Min. CPU frequency: '1.2GHz' for CPUs 0-87 (all CPUs)
Max. CPU frequency: '3.6GHz' for CPUs 0-87 (all CPUs)
首先,獲取現任州長的名字和受支持的州長名單。
$ pepc pstates info --governor --governors
CPU frequency governor: 'schedutil' for CPUs 0-87 (all CPUs)
Available CPU frequency governors: conservative, ondemand, userspace, powersave, performance, schedutil
切換到“績效”調速器。
$ pepc pstates config --governor performance
CPU frequency governor: set to 'performance' for CPUs 0-87 (all CPUs)
驗證它。
$ pepc pstates info --governor
CPU frequency governor: 'performance' for CPUs 0-87 (all CPUs)
$ pepc cstates info
Source: Linux sysfs file-system
- POLL: 'on' for CPUs 0-87 (all CPUs)
- description: CPUIDLE CORE POLL IDLE
- expected latency: 0 us
- target residency: 0 us
- C1: 'on' for CPUs 0-87 (all CPUs)
- description: MWAIT 0x00
- expected latency: 2 us
- target residency: 2 us
- C1E: 'on' for CPUs 0-87 (all CPUs)
- description: MWAIT 0x01
- expected latency: 10 us
- target residency: 20 us
- C3: 'off' for CPUs 0-87 (all CPUs)
- description: MWAIT 0x10
- expected latency: 40 us
- target residency: 100 us
- C6: 'on' for CPUs 0-87 (all CPUs)
- description: MWAIT 0x20
- expected latency: 133 us
- target residency: 400 us
Source: Model Specific Register (MSR)
- Package C-state limit: 'PC6' for CPUs 0-87 (all CPUs)
- Package C-state limit lock: 'on' for CPUs 0-87 (all CPUs)
- Available package C-state limits: PC0, PC2, PC3, PC6, unlimited
- C1 demotion: 'off' for CPUs 0-87 (all CPUs)
- C1 undemotion: 'off' for CPUs 0-87 (all CPUs)
- C1E autopromote: 'off' for CPUs 0-87 (all CPUs)
- C-state prewake: 'on' for CPUs 0-87 (all CPUs)
Source: Linux sysfs file-system
- Idle driver: intel_idle
- Idle governor: 'menu' for CPUs 0-87 (all CPUs)
- Available idle governors: menu
$ pepc cstates info --cstates C1 --c1e-autopromote --c1-demotion
C1: 'on' for CPUs 0-87 (all CPUs)
- description: MWAIT 0x00
- expected latency: 2 us
- target residency: 2 us
C1E autopromote: 'off' for CPUs 0-87 (all CPUs)
C1 demotion: 'off' for CPUs 0-87 (all CPUs)
禁用所有C州,但對所有CPU進行了民意調查。
$ pepc cstates config --disable all --enable POLL
POLL: set to 'off' for CPUs 0-87 (all CPUs)
C1: set to 'off' for CPUs 0-87 (all CPUs)
C1E: set to 'off' for CPUs 0-87 (all CPUs)
C3: set to 'off' for CPUs 0-87 (all CPUs)
C6: set to 'off' for CPUs 0-87 (all CPUs)
POLL: set to 'on' for CPUs 0-87 (all CPUs)
在所有CPU上啟用所有C型狀態。
$ pepc cstates config --enable all
POLL: set to 'on' for CPUs 0-87 (all CPUs)
C1: set to 'on' for CPUs 0-87 (all CPUs)
C1E: set to 'on' for CPUs 0-87 (all CPUs)
C3: set to 'on' for CPUs 0-87 (all CPUs)
C6: set to 'on' for CPUs 0-87 (all CPUs)
禁用C1E和包裝1上的C6。
$ pepc cstates config --disable C1E,C6 --packages 1
C1E: set to 'off' for CPUs 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87 (package 1)
C6: set to 'off' for CPUs 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87 (package 1)
獲取軟件包C狀態限制信息。
$ pepc cstates info --pkg-cstate-limit
Package C-state limit: 'PC6' for CPUs 0-87 (all CPUs)
Package C-state limit lock: 'off' for CPUs 0-87 (all CPUs)
Available package C-state limits: PC0, PC2, PC3, PC6, unlimited
由於軟件包c-state限制MSR未鎖定,因此我們可以修改限制。將最深的允許的C-State設置為所有軟件包的PC0。
$ pepc cstates config --pkg-cstate-limit PC0 --packages all
Package C-state limit set to 'PC0' for CPUs 0-87 (all CPUs)
$ pepc power info
Source: Model Specific Register (MSR)
- TDP: 83W for all CPUs
- RAPL PPL1: 83W for all CPUs
- RAPL PPL1: 'on' for all CPUs
- RAPL PPL1 clamping: 'on' for all CPUs
- RAPL PPL1 time window: 1s for all CPUs
- RAPL PPL2: 99.625W for all CPUs
- RAPL PPL2: 'on' for all CPUs
- RAPL PPL2 clamping: 'on' for all CPUs
- RAPL PPL2 time window: 1s for all CPUs
$ pepc aspm info
ASPM policy: default
Available policies: default, performance, powersave, powersupersave
首先,檢查當前的在線/離線情況。
$ pepc cpu-hotplug info
The following CPUs are online: 0-87
No offline CPUs
離線CPU 5,6,7,8和CPU 87。
$ pepc cpu-hotplug offline --cpus 5-8,87
Offlining CPU5
Offlining CPU6
Offlining CPU7
Offlining CPU8
Offlining CPU87
$ pepc cpu-hotplug online --cpus all
Onlining CPU5
Onlining CPU6
Onlining CPU7
Onlining CPU8
Onlining CPU87
核心兄弟姐妹是一個核心的CPU。在英特爾芯片上,有超線程。如果系統每個核心具有兩個CPU(執行單元,超線程),則其核心兄弟姐妹索引為0和1。要禁用超線程,請使用索引1離線所有核心兄弟姐妹。
$ pepc cpu-hotplug offline --cpus all --core-siblings 1
提示:使用'PEPC拓撲信息 - 列核心,CPU'來找出核心和CPU數字之間的關係。
在多插座系統上,有多個CPU軟件包。您可以離線包裝的所有CPU有效地“禁用”它。這是針對包裝1的方法。
$ pepc cpu-hotplug offline --packages 1
$ pepc topology info
CPU Core Node Package
0 0 0 0
1 0 1 1
2 1 0 0
3 1 1 1
... snip ...
85 27 1 1
86 28 0 0
87 28 1 1
該表給出了一個關於CPU,CORE,NUMA節點和軟件包編號如何相互關聯的想法。
僅針對某些Intel平台實現了一些“ PEPC”功能(例如' - pkg-cstate-limit')。這並不一定意味著該功能不受其他平台的支持,這僅意味著我們在有限量的平台上對其進行了驗證。只是為了安全起見,我們拒絕更改我們未驗證的平台上的基礎MSR寄存器。
如果“ PEPC”失敗了,則為您提供“此功能不支持此功能”的消息,請隨時通過請求與作者聯繫。通常,它最終只是將CPU ID添加到支持的平台列表中,也許您可以自己做並提交補丁/拉動請求。