PEPC significa "Configurador de energía, energía y rendimiento". Esta es una herramienta de línea de comandos para configurar las funciones de administración de potencia de CPU.
IMPORTANTE : Esta es la herramienta es solo para fines de depuración e investigación. Requiere permisos de raíz y solo debe usarse en un entorno de laboratorio aislado, no en producción.
Existen muchas herramientas de Linux para configurar la administración de energía en Linux, y esta subsección intenta explicar por qué creamos otra.
Estamos haciendo mucho trabajo relacionado con la potencia y el rendimiento, como medir la latencia de los estados C utilizando WULT, ejecutar varias cargas de trabajo y recopilar estadísticas de potencia y rendimiento utilizando STATS-Collect. A menudo necesitamos configurar diversos aspectos de potencia y rendimiento del sistema, por ejemplo, habilitar o deshabilitar los estados C, limitar la CPU o la frecuencia de coros nocturnos, ajustar características de hardware como la degradación C1, etc.
Antes de que se creara 'PEPC', tuvimos que usar muchas herramientas diferentes, como 'Cpupower' o 'LSCPU', recuerde las rutas SYSFS para varias perillas, tal camino para deshabilitar un estado C. Esto fue difícil y propenso a errores. Tampoco era lo suficientemente flexible para nosotros. Por ejemplo, deshabilitar C1 solo para un módulo de CPU fue una tarea difícil, porque primero debe descubrir cuáles son los números de CPU en ese módulo, y luego deshabilitar C1 en cada CPU. Y finalmente, muchas características de hardware como la degradación C1 requieren conocimiento del registro MSR y el número de bits para alternar. 'WRMSR' y 'RDMSR' son herramientas útiles, pero no fueron lo suficientemente fáciles de usar de manera regular.
Creamos 'PEPC' para facilitar la potencia y la configuración de rendimiento. Con PEPC, no tenemos que recordar las rutas SYSFS y los números de MSR (registro específico del modelo) específicos de la plataforma. La herramienta es flexible, admite muchos modelos de CPU, bien estructurados y también proporciona API de Python para otros proyectos de Python.
PEPC admite descubrir y configurar las siguientes funciones.
Algunas de las características son independientes del hardware, pero algunas son específicas del hardware.
Nota, mientras que 'PEPC' está disponible a través de paquetes del sistema operativo, generalmente no proporcionan la última versión. Use el método de instalación "PIP" para obtener la última versión 'PEPC'.
'PEPC' está disponible en Fedora 38 y 39. Para instalar 'PEPC', ejecutar
sudo dnf install pepc
Los paquetes de Fedora son mantenidos por Ali Erdinç Köroğlu [email protected].
En el caso de Fedora 37 o más Fedora, use el método de instalación 'PIP'. Pero instale las dependencias ejecutando
sudo dnf install -y rsync openssl-devel util-linux procps-ng
sudo dnf install -y python3-colorama python3-paramiko python3-argcomplete
'PEPC' está disponible para CentOS 9 Stream a través del repositorio 'EPEL'. Aquí le mostramos cómo agregar 'Epel' e instalar 'PEPC'.
sudo dnf install epel-release
sudo dnf install pepc
Los paquetes EPEL son mantenidos por Ali Erdinç Köroğlu [email protected].
No proporcionamos paquetes Ubuntu/Debian, por lo que deberá usar el método de instalación 'PIP'. Sin embargo, instale las siguientes dependencias.
sudo apt install -y rsync libssl-dev util-linux procps python3 git
sudo apt install -y python3-pip python3-colorama python3-paramiko python3-argcomplete
Ejecute el siguiente comando:
sudo pip3 install --upgrade git+https://github.com/intel/pepc.git@release
Este comando descargará 'PEPC' de la rama 'Release' del repositorio GIT e instalará en el sistema.
La otra forma de hacerlo es clonando primero el repositorio de git y ejecutando
git clone https://github.com/intel/pepc.git --branch release pepc
cd pepc
pip3 install --upgrade .
Tenga en cuenta que 'PEPC' debe ejecutarse con privilegios de Superuser (root) en muchos casos, y si lo instala con la opción '-User' de 'PIP3', no funcionará "fuera de la caja". Es por eso que no recomendamos usar '-User'.
También puede crear una versión independiente de esta herramienta clonando el repositorio y ejecutando un par de comandos. A continuación se muestra un ejemplo. Es posible que desee ajustar el shebang '#!/Usr/bin/python3'.
En primer lugar, asegúrese de que el comando a continuación imprima "bueno". Verifica que su versión '/usr/bin/python3' sea mayor que 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")'
Crea la versión independiente 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
Esto creará el archivo 'Pepc.Standalone', que puede cambiar el nombre y copiar en cualquier lugar. Funcionará como un programa independiente.
'PEPC' tiene soporte de finalización de pestañas, pero esto solo funcionará si tiene ciertas variables de entorno definidas. El siguiente comando lo hará:
eval "$(register-python-argcomplete pepc)"
Puede poner esta línea en su archivo '.BASHRC' para que las finalizaciones de la pestaña 'PEPC' habilitan de forma predeterminada.
$ 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
Limite la reorganización de frecuencia de la CPU a [1.5GHz, 2GHz] para todas las CPU.
$ 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)
Verificarlo.
$ 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)
Bloquee la frecuencia de la CPU a la frecuencia base (HFM) para todas las CPU en los núcleos 0 y 4 del paquete 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
Verificarlo.
$ 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
Desbloquee la frecuencia de la CPU en todas las 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)
Verificarlo.
$ 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)
Primero, obtenga el nombre del actual gobernador y la lista de gobernadores compatibles.
$ 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
Cambie al gobernador de "rendimiento".
$ pepc pstates config --governor performance
CPU frequency governor: set to 'performance' for CPUs 0-87 (all CPUs)
Verificarlo.
$ 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)
Deshabilite todos los estados C pero encuesten en todas las 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)
Habilite todos los estados C en todas las CPU.
$ 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)
Desactive C1E y C6 en el paquete 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)
Obtenga información límite del paquete 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
Dado que el límite de estado C de paquete C-State MSR no está bloqueado, podemos modificar el límite. Establezca el paquete C-estado más profundo permitido en PC0 en todos los paquetes.
$ 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
Primero, consulte la situación actual en línea/fuera de línea.
$ pepc cpu-hotplug info
The following CPUs are online: 0-87
No offline CPUs
CPU fuera de línea 5,6,7,8 y 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
Los hermanos centrales son CPU con un núcleo. En los chips Intel, están los hyperthreads. Si un sistema tiene dos CPU (unidades de ejecución, HyperThreads) por núcleo, entonces sus índices de hermanos centrales son 0 y 1. Para deshabilitar HyperThreads, fuera de línea todos los hermanos centrales con el índice 1.
$ pepc cpu-hotplug offline --cpus all --core-siblings 1
Sugerencia: use 'Información de topología PEPC -Coronal de columnas, CPU' para descubrir la relación entre los números de núcleo y CPU.
En los sistemas de múltiples salsas hay múltiples paquetes de CPU. Puede fuera de línea todas las CPU de un paquete para "deshabilitarlo" de manera efectiva. Aquí está cómo hacerlo para el paquete 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
La tabla ofrece una idea sobre cómo los números de CPU, Core, Numa Node y paquetes están relacionados entre sí.
Algunas características de 'PEPC' (por ejemplo, "--PKG-CSTATE-LIMIT") se implementan solo para ciertas plataformas Intel. Esto no significa necesariamente que la característica no sea compatible con otras plataformas, solo significa que la verificamos en una cantidad limitada de plataformas. Solo para estar en un lado seguro, nos negamos a cambiar los registros MSR subyacentes en las plataformas que no verificamos.
Si 'PEPC' falla con un mensaje como "Esta característica no es compatible con esta plataforma" para usted, no dude en contactar a los autores con una solicitud. Muy a menudo termina con solo agregar una ID de CPU a la lista de plataformas compatibles, y puede ser que pueda hacerlo usted mismo y enviar una solicitud de parche/extracción.