PEPCは、「パワー、エネルギー、パフォーマンスコンフィギュレーター」の略です。これは、CPU電源管理機能を構成するためのコマンドラインツールです。
重要:これは、デバッグと研究のみを目的とするツールです。根の権限が必要であり、生産ではなく孤立したラボ環境でのみ使用する必要があります。
Linuxで電力管理を構成するための多くのLinuxツールがあり、このサブセクションは、さらに別のものを作成した理由を説明しようとします。
Wultを使用したC-Statesのレイテンシを測定したり、さまざまなワークロードを実行したり、Stats-Collectを使用してパワーとパフォーマンスの統計を収集したりするなど、パワーとパフォーマンスに関連する多くの作業を行っています。多くの場合、システムのさまざまなパワーとパフォーマンスの側面を構成する必要があります。たとえば、C-Stateを有効または無効にし、CPUまたはUNCORE頻度を制限し、C1 Demotionなどの調整ハードウェア機能などです。
「PEPC」が作成される前に、「CPUPOWER」や「LSCPU」などのさまざまなツールを使用する必要がありました。Cステートを無効にするパスなど、さまざまなノブのSYSFSパスを覚えておいてください。これは困難でエラーが発生しやすいものでした。また、私たちにとって十分な柔軟性がありませんでした。たとえば、1つのCPUモジュールに対してのみC1を無効にすることは困難なタスクでした。これは、最初にそのモジュールのCPU数を把握し、すべてのCPUでC1を無効にする必要があるためです。そして最後に、C1 Demotionなどの多くのハードウェア機能には、MSRレジスタとトグルするビット番号の知識が必要です。 「WRMSR」と「RDMSR」は有用なツールですが、定期的に使用するのは簡単ではありませんでした。
「PEPC」を作成して、パワーとパフォーマンスの構成タスクを容易にしました。 PEPCを使用すると、SYSFSパスとプラットフォーム固有のMSR(モデル固有のレジスタ)番号を覚えておく必要はありません。このツールは柔軟性があり、多くのCPUモデルをサポートし、よく構築されており、他のPythonプロジェクトに使用するPython APIも提供します。
PEPCは、次の機能の発見と構成をサポートしています。
一部の機能はハードウェアに依存しませんが、一部はハードウェア固有です。
注意してください、「PEPC」はOSパッケージを介して利用できますが、通常、最新バージョンを提供しません。 「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」をダウンロードし、システムにインストールします。
これを行うもう1つの方法は、最初にGitリポジトリをクローニングして実行することです
git clone https://github.com/intel/pepc.git --branch release pepc
cd pepc
pip3 install --upgrade .
多くの場合、「PEPC」はスーパーユーザー(ルート)特権を使用して実行する必要があります。また、「PIP3」の「ユーザー」オプションでインストールすると、「箱から出して」機能しません。これが、 '-user'を使用することをお勧めしない理由です。
また、リポジトリをクローン化し、いくつかのコマンドを実行することにより、このツールのスタンドアロンバージョンを作成することもできます。以下は例です。 '#!/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」にはタブの完了サポートがありますが、これは特定の環境変数が定義されている場合にのみ機能します。次のコマンドがそれを行います:
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)
パッケージ1のコア0および4のすべてのCPUのベース周波数(HFM)に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-Stateを無効にしますが、すべての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)
パッケージ1でC1Eと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-Stateの制限情報を取得します。
$ 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の制限はロックされていないため、制限を変更できます。すべてのパッケージで最も深い許可されたパッケージ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
コアの兄弟は、1つのコアを備えたCPUです。 Intelチップには、ハイパースレッドがあります。システムにコアごとに2つの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、コア、numaノード、パッケージ番号が互いにどのように関連しているかについてのアイデアを示しています。
いくつかの「PEPC」機能(例: '-PKG-CSTATE-LIMIT')は、特定のIntelプラットフォームに対してのみ実装されています。これは、この機能が他のプラットフォームによってサポートされていないことを必ずしも意味するわけではなく、限られた量のプラットフォームでそれを確認したことを意味します。安全な面では、確認しなかったプラットフォーム上の基礎となるMSRレジスタの変更を拒否します。
「PEPC」が「この機能がこのプラットフォームでサポートされていない」などのメッセージが失敗した場合、リクエストで著者にお気軽にお問い合わせください。非常に多くの場合、サポートされているプラットフォームのリストにCPU IDを追加するだけで、自分で実行してパッチ/プルリクエストを送信できる場合があります。