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添加到支持的平台列表中,也许您可以自己做并提交补丁/拉动请求。