A PEPC significa "Configurador de energia, energia e desempenho". Esta é uma ferramenta de linha de comando para configurar os recursos de gerenciamento de energia da CPU.
Importante : Esta é a ferramenta é apenas para fins de depuração e pesquisa. Requer permissões de raiz e só deve ser usado em um ambiente de laboratório isolado, não em produção.
Existem muitas ferramentas do Linux para configurar o gerenciamento de energia no Linux, e essa subseção tenta explicar por que criamos mais uma.
Estamos fazendo muito trabalho relacionado ao poder e desempenho, como medir a latência dos estados C usando o WULT, executando várias cargas de trabalho e coletando estatísticas de poder e desempenho usando o Stats-Collect. Geralmente, precisamos configurar vários aspectos de energia e desempenho do sistema, por exemplo, ativar ou desativar os estados C, limitar a CPU ou a frequência não intencional, ajustar recursos de hardware como o Demotion C1 e assim por diante.
Antes de 'Pepc' ser criado, tivemos que usar muitas ferramentas diferentes, como 'cPuPower' ou 'LSCPU', lembre-se de caminhos Sysfs para vários botões, um caminho para desativar um estado C. Isso foi difícil e propenso a erros. Também não foi flexível o suficiente para nós. Por exemplo, desativar C1 apenas para um módulo da CPU foi uma tarefa difícil, porque é preciso descobrir primeiro quais são os números da CPU nesse módulo e, em seguida, desativar C1 em cada CPU. E, finalmente, muitos recursos de hardware, como o C1 Demotion, requer conhecimento do registro MSR e o número de bits para alternar. Os 'WRMSR' e 'RDMSR' são ferramentas úteis, mas não eram fáceis o suficiente para usarmos regularmente.
Criamos 'PEPC' para facilitar as tarefas de configuração de energia e desempenho. Com o PEPC, não precisamos lembrar os caminhos do SYSFS e números de MSR específicos da plataforma (registro específico do modelo). A ferramenta é flexível, suporta muitos modelos de CPU, bem estruturada e também fornece API Python para outros projetos Python usarem.
A PEPC suporta descobrir e configurar os seguintes recursos.
Alguns dos recursos são independentes de hardware, mas outros são específicos de hardware.
Observe que, embora o 'PEPC' esteja disponível por meio de pacotes do sistema operacional, eles normalmente não fornecem a versão mais recente. Use o método de instalação "PIP" para obter a mais recente versão 'pepc'.
'PEPC' está disponível no Fedora 38 e 39. Para instalar 'pepc', execute
sudo dnf install pepc
Os pacotes do Fedora são mantidos por Ali Erdinç Köroğlu [email protected].
No caso do Fedora 37 ou mais antigo, use o método de instalação 'PIP'. Mas instale as dependências executando
sudo dnf install -y rsync openssl-devel util-linux procps-ng
sudo dnf install -y python3-colorama python3-paramiko python3-argcomplete
'PEPC' está disponível para o CentOS 9 Stream através do repositório 'EPEL'. Aqui está como adicionar 'epel' e instalar 'pepc'.
sudo dnf install epel-release
sudo dnf install pepc
Os pacotes EPEL são mantidos por Ali Erdinç Köroğlu [email protected].
Não fornecemos pacotes Ubuntu/Debian, então você precisará usar o método de instalação 'PIP'. Instale as seguintes dependências, no entanto.
sudo apt install -y rsync libssl-dev util-linux procps python3 git
sudo apt install -y python3-pip python3-colorama python3-paramiko python3-argcomplete
Execute o seguinte comando:
sudo pip3 install --upgrade git+https://github.com/intel/pepc.git@release
Este comando baixará 'pepc' da filial 'Release' do repositório Git e o instalará no sistema.
A outra maneira de fazer isso é clonar primeiro o repositório Git e executar
git clone https://github.com/intel/pepc.git --branch release pepc
cd pepc
pip3 install --upgrade .
Observe que 'pepc' deve ser executado com privilégios de superusuário (raiz) em muitos casos e, se você o instalar com a opção '--User' de 'pip3', ele não funcionará "pronta para uso". É por isso que não recomendamos o uso de '--user'.
Você também pode criar uma versão independente desta ferramenta clonando o repositório e executando alguns comandos. Abaixo está um exemplo. Você pode querer ajustar o '#!/Usr/bin/python3' shebang nele.
Primeiro de tudo, verifique se o comando abaixo imprime "bom". Ele verifica que sua versão '/usr/bin/python3' é maior 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")'
Crie a versão independente 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
Isso criará o arquivo 'pepc.standalone', que você pode renomear e copiar em qualquer lugar. Funcionará como um programa independente.
'PEPC' tem suporte de conclusão de guias, mas isso só funcionará se você tiver certas variáveis de ambiente definidas. O seguinte comando fará isso:
eval "$(register-python-argcomplete pepc)"
Você pode colocar essa linha no seu arquivo '.bashrc' para ter as conclusões da guia 'pepc' ativadas por padrão.
$ 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 a reorganização da frequência da CPU a [1,5 GHz, 2GHz] para todas as CPUs.
$ 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)
Verifique.
$ 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)
Bloqueie a frequência da CPU na frequência base (HFM) para todas as CPUs nos núcleos 0 e 4 do pacote 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
Verifique.
$ 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
Desbloqueie a frequência da CPU em todas as CPUs.
$ 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)
Verifique.
$ 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)
Primeiro, obtenha o nome do governador atual e a lista de governadores suportados.
$ 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
Mude para o governador "performance".
$ pepc pstates config --governor performance
CPU frequency governor: set to 'performance' for CPUs 0-87 (all CPUs)
Verifique.
$ 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)
Desative todos os estados C, mas pesquise todas as CPUs.
$ 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 os estados C em todas as CPUs.
$ 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)
Desative C1E e C6 no pacote 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)
Obtenha informações limitadas do pacote 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
Como o limite do estado C do pacote MSR não está bloqueado, podemos modificar o limite. Defina o pacote C-State mais profundo permitido para PC0 em todos os pacotes.
$ 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
Primeiro, verifique a situação atual online/offline.
$ pepc cpu-hotplug info
The following CPUs are online: 0-87
No offline CPUs
CPUs offline 5,6,7,8 e 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
Os irmãos principais são CPUs com um núcleo. Nos chips Intel, existem os hiperthreads. Se um sistema possui duas CPUs (unidades de execução, hiperthreads) por núcleo, seus principais índices de irmãos são 0 e 1. Para desativar os hiperthreads, offline todos os irmãos com o índice 1.
$ pepc cpu-hotplug offline --cpus all --core-siblings 1
Dica: use 'PEPC Topology Info -Columns Core, CPU' para descobrir a relação entre números núcleo e CPU.
Em sistemas de vários soquetes, existem vários pacotes de CPU. Você pode offline todas as CPUs de um pacote para "desativá -lo" efetivamente. Aqui está como fazer isso para o pacote 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
A tabela dá uma idéia sobre como os números de CPU, núcleo, nó NUMA e pacotes estão relacionados entre si.
Alguns recursos de 'pepc' (por exemplo, '--pkg-cstate-limit') são implementados apenas para determinadas plataformas Intel. Isso não significa necessariamente que o recurso não é suportado por outras plataformas, isso significa apenas que o verificamos em uma quantidade limitada de plataformas. Só para ficar em um lado seguro, recusamos a alteração dos registros MSR subjacentes em plataformas que não verificamos.
Se 'pepc' falhar com uma mensagem como "Esse recurso não for suportado nesta plataforma" para você, sinta -se à vontade para entrar em contato com os autores com uma solicitação. Muitas vezes, acaba adicionando um ID da CPU à lista de plataformas suportadas e pode ser você mesmo e enviar uma solicitação de patch/puxão.