PEPC signifie "Power, Energy et Performance Configurator". Il s'agit d'un outil de ligne de commande pour configurer les fonctionnalités de gestion de l'alimentation CPU.
IMPORTANT : Cet outil est à des fins de débogage et de recherche uniquement. Il nécessite des autorisations racinaires et ne doit être utilisée que dans un environnement de laboratoire isolé, pas dans la production.
Il existe de nombreux outils Linux pour configurer la gestion de l'alimentation dans Linux, et cette sous-section essaie d'expliquer pourquoi nous en avons créé un autre.
Nous faisons beaucoup de travail liés à la puissance et aux performances, tels que la mesure de la latence des états C à l'aide de WULT, la gestion de diverses charges de travail et la collecte de statistiques de puissance et de performance en utilisant les statistiques. Nous devons souvent configurer divers aspects de puissance et de performances du système, par exemple, activer ou désactiver les états C, limiter le processeur ou une fréquence non décorée, ajuster les fonctionnalités matérielles comme la rétrogradation C1, etc.
Avant la création de «PEPC», nous avons dû utiliser de nombreux outils différents, tels que «CPUPOWER» ou «LSCPU», rappelez-vous les chemins SYSFS pour divers boutons, tel chemin pour désactiver un État en C. C'était difficile et sujet aux erreurs. Ce n'était pas non plus suffisamment flexible pour nous. Par exemple, la désactivation de C1 uniquement pour un module CPU était une tâche difficile, car il faut d'abord déterminer quels sont les nombres de CPU dans ce module, puis désactiver C1 sur chaque CPU. Et enfin, de nombreuses fonctionnalités matérielles telles que C1 Demotion nécessitent une connaissance du registre MSR et du numéro de bit à basculer. Les «WRMSR» et «RDMSR» sont des outils utiles, mais ils n'étaient pas assez faciles à utiliser régulièrement.
Nous avons créé le «PEPC» pour faciliter les tâches de configuration d'alimentation et de performances. Avec PEPC, nous n'avons pas à nous souvenir des chemins SYSFS et des numéros MSR spécifiques à la plate-forme (registre spécifique au modèle). L'outil est flexible, prend en charge de nombreux modèles CPU, bien structurés et fournit également une API Python pour d'autres projets Python à utiliser.
PEPC prend en charge la découverte et la configuration des fonctionnalités suivantes.
Certaines des fonctionnalités sont indépendantes du matériel, mais certaines sont spécifiques au matériel.
Remarque, bien que «PEPC» soit disponible via des packages OS, ils ne fournissent généralement pas la dernière version. Utilisez la méthode d'installation "PIP" pour obtenir la dernière version «PEPC».
«PEPC» est disponible sur Fedora 38 et 39. Pour installer «PEPC», exécutez
sudo dnf install pepc
Les forfaits Fedora sont maintenus par Ali Erdinç Köroğlu [email protected].
Dans le cas de Fedora 37 ou de Fedora plus ancien, utilisez la méthode d'installation «PIP». Mais installez les dépendances en exécutant
sudo dnf install -y rsync openssl-devel util-linux procps-ng
sudo dnf install -y python3-colorama python3-paramiko python3-argcomplete
«PEPC» est disponible pour Centos 9 Stream via le référentiel «EPEL». Voici comment ajouter «Epel» et installer «PEPC».
sudo dnf install epel-release
sudo dnf install pepc
Les forfaits EPEL sont maintenus par Ali Erdinç Köroğlu [email protected].
Nous ne fournissons pas de packages Ubuntu / Debian, vous devrez donc utiliser la méthode d'installation «PIP». Installez cependant les dépendances suivantes.
sudo apt install -y rsync libssl-dev util-linux procps python3 git
sudo apt install -y python3-pip python3-colorama python3-paramiko python3-argcomplete
Exécutez la commande suivante:
sudo pip3 install --upgrade git+https://github.com/intel/pepc.git@release
Cette commande téléchargera «PEPC» à partir de la branche «Release» du référentiel GIT et l'installera sur le système.
L'autre façon de le faire est de cloner d'abord le référentiel Git et de fonctionner
git clone https://github.com/intel/pepc.git --branch release pepc
cd pepc
pip3 install --upgrade .
Remarque, «PEPC» doit être exécuté avec des privilèges SuperUser (root) dans de nombreux cas, et si vous l'installez avec l'option «- user» de «PIP3», cela ne fonctionnera pas «hors de la boîte». C'est pourquoi nous ne recommandons pas d'utiliser «--User».
Vous pouvez également créer une version autonome de cet outil en clonage le référentiel et en exécutant quelques commandes. Vous trouverez ci-dessous un exemple. Vous voudrez peut-être ajuster le shebang '#! / Usr / bin / python3'.
Tout d'abord, assurez-vous que la commande ci-dessous imprime "bon". Il vérifie que votre version '/ usr / bin / python3' est supérieure à 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")'
Créez la version autonome de «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
Cela créera le fichier «pepc.standalone», que vous pouvez renommer et copier n'importe où. Cela fonctionnera comme un programme autonome.
«PEPC» a une prise en charge des compléments d'onglet, mais cela ne fonctionnera que si certaines variables d'environnement sont définies. La commande suivante le fera:
eval "$(register-python-argcomplete pepc)"
Vous pouvez mettre cette ligne à votre fichier '.bashrc' afin que les compléments d'onglet «PEPC» soient activés par défaut.
$ 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
Limitez la fréquence du processeur réorganisée à [1,5 GHz, 2 GHz] pour tous les processeurs.
$ 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)
Vérifiez-le.
$ 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)
Verrouillez la fréquence du processeur à la fréquence de base (HFM) pour tous les processeurs dans les noyaux 0 et 4 de l'emballage 1.
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
Vérifiez-le.
$ 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
Déverrouillez la fréquence du processeur sur tous les processeurs.
$ 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)
Vérifiez-le.
$ 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)
Tout d'abord, obtenez le nom du gouverneur actuel et de la liste des gouverneurs soutenus.
$ 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
Passez au gouverneur de la «performance».
$ pepc pstates config --governor performance
CPU frequency governor: set to 'performance' for CPUs 0-87 (all CPUs)
Vérifiez-le.
$ 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)
Désactivez tous les états C mais interroger sur tous les processeurs.
$ 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)
Activez tous les états C sur tous les processeurs.
$ 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)
Désactivez C1E et C6 sur le package 1.
$ 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)
Obtenez des informations de limite d'état C de l'emballage.
$ 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
Étant donné que le package C-State Limit MSR n'est pas verrouillé, nous pouvons modifier la limite. Définissez le package C-State le plus profond sur PC0 sur tous les packages.
$ 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
Tout d'abord, consultez la situation actuelle en ligne / hors ligne.
$ pepc cpu-hotplug info
The following CPUs are online: 0-87
No offline CPUs
CPU hors ligne 5,6,7,8 et 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
Les frères et sœurs de noyau sont des processeurs avec un noyau. Sur les puces Intel, il y a les hyperthreads. Si un système a deux processeurs (unités d'exécution, hyperthreads) par noyau, leurs indices de frères et sœurs de base sont 0 et 1 pour désactiver les hyperthreads, tous les frères et sœurs de noyau avec l'indice 1.
$ pepc cpu-hotplug offline --cpus all --core-siblings 1
Astuce: utilisez «PEPC Topology Info - Colonnes Core, CPU» pour déterminer la relation entre les nombres du noyau et du CPU.
Sur un système à plusieurs places, il existe plusieurs packages CPU. Vous pouvez hors ligne tous les processeurs d'un package pour le "désactiver" efficacement. Voici comment le faire pour le package 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
Le tableau donne une idée de la façon dont les numéros CPU, CORE, NUMA Node et Package sont liés les uns aux autres.
Certaines fonctionnalités «PEPC» (par exemple, «- pkg-cstate-limit») sont implémentées uniquement pour certaines plateformes Intel. Cela ne signifie pas nécessairement que la fonctionnalité n'est pas prise en charge par d'autres plateformes, cela signifie seulement que nous l'avons vérifié sur une quantité limitée de plateformes. Juste pour être sûr, nous refusons de modifier les registres MSR sous-jacents sur les plates-formes que nous n'avons pas vérifiées.
Si 'PEPC' échoue avec un message comme "Cette fonctionnalité n'est pas prise en charge sur cette plate-forme" pour vous, n'hésitez pas à contacter les auteurs avec une demande. Très souvent, cela finit par l'ajout d'un ID de CPU à la liste des plates-formes prises en charge, et peut-être que vous pouvez le faire vous-même et soumettre une demande de patch / traction.