No meu Ubuntu 16.04, estou executando um programa relativamente caro em termos de uso da CPU. Leva muito tempo para terminar e outras tarefas (como navegar na web) ficam mais lentas como consequência. Eu estava procurando uma maneira de melhorar o poder de computação, se possível e ao mesmo tempo saber melhor o que está acontecendo no meu laptop.
Com isso, descobri que, se eu perguntar top
, o programa que estou executando mostra um uso de CPU de 100%, enquanto quando abro o System monitor
uso da CPU é de apenas ~ 25% na Processes
guia. Além disso, a Resources
aba do System monitor mostra 4 CPUs, cujo uso varia de ~5 a ~100% para cada uma:
O resultado de lscpu
é:
@C:~$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 142
Model name: Intel(R) Core(TM) i5-7200U CPU @2.50GHz
Stepping: 9
CPU MHz: 3099.937
CPU max MHz: 3100,0000
CPU min MHz: 400,0000
BogoMIPS: 5423.81
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
NUMA node0 CPU(s): 0-3
Existe algo que eu possa fazer para melhorar a situação, como diluir o trabalho entre as 4 CPUs? Usinge nice
não parece uma solução para minha situação.
Sei que essa pode ser uma dúvida geral que depende do tipo de programa que estou executando (digamos que seja um Python
script), mas estou tentando aqui obter conhecimentos gerais.
Resumindo: não. O programa é de thread único.
O Top pode mostrar o uso da CPU de duas maneiras: saturação por CPU ou participação no total. Se você tiver um sistema de quatro núcleos, a parte superior pode mostrar o modo Irix:
Você pode alternar isso pressionando I no topo. Como você tem quatro núcleos de CPU, o uso é dividido por quatro, e você vai mostrar 25%. Se você ativar o modo Irix, ele mostrará 100%.
Seu aplicativo é de thread único. Ele executa um thread sequencial, em um núcleo da CPU. Se você tiver o código-fonte, poderá alterá-lo. No entanto, geralmente não é uma tarefa trivial e, dependendo da tarefa, pode não ser possível.
O Linux possui um agendador que distribuirá threads em execução para diferentes CPUs/núcleos.
100% vs 25% de uso da CPU
Segundo
lscpu
, você tem quatro núcleos em sua CPU:top
usa 100% por núcleo, portanto, se você tiver um processador de quatro núcleos, será 400%. Você está usando um núcleo completamente, então isso é 100% dos 400%. O monitor do sistema usa 100% para tudo (ou talvez por CPU real, não tenho certeza). Um núcleo é um quarto dos quatro núcleos disponíveis, portanto, aparece como 25% de uso no monitor do sistema.Desaceleração significativa com um núcleo usado
Se o sistema estiver um pouco lento, provavelmente é apenas o uso da CPU, e você não pode fazer muito sobre isso além de aumentar o valor da gentileza dos processos da carga de trabalho.
Se estiver diminuindo para muito menos do que três quartos da velocidade, provavelmente está usando muita E/S para que outros aplicativos não possam fazer E/S muito rapidamente, usando arquivos ou a rede ou trocando se não houver RAM suficiente no sistema, que são todos mostrados no aplicativo do monitor do sistema. O uso e a troca de arquivos também são mostrados com
sudo iotop
.Mudando a prioridade da tarefa
Você pode usar
nice
com um valor alto como 15 para fazer a tarefa dar lugar a outras tarefas que precisam da CPU:Desacelerando a tarefa
Você pode tentar
nice
colocar o programa em um valor alto como 15 e usar ocpulimit
programa (nocpulimit
pacote APT) para reduzir o uso da CPU enquanto ele pode ser executado.Um exemplo diminuindo a
the-program its-arguments
velocidade para 60% do uso da CPU e usando um valor de gentileza de 15:Usando vários núcleos
Existem algumas maneiras de proceder até dividir a carga de trabalho para usar mais núcleos. Isso provavelmente não é o que você deseja fazer se estiver tentando fazer outras coisas no computador, pois ele pode usar ainda mais poder de processamento para executar as tarefas mais rapidamente.
Uma delas é executar o processo quatro vezes cada uma com um quarto da carga de trabalho, se houver alguma maneira de especificar a carga de trabalho ao executá-la. Uma possibilidade útil em algumas circunstâncias é usar
xargs -n ## -P 4 command
para processar##
itens de cada vez em cada núcleo usando 4 núcleos.Outra é reescrever o aplicativo para usar quatro ou mais threads em vez de apenas um. Se houver muita E/S esperando em seu aplicativo ou algo assim, você poderá aumentá-la muito acima de quatro threads.
Existem outras possibilidades também.
Combinando o uso de vários núcleos com a desaceleração da tarefa e a definição do valor de gentileza
Você pode combinar o uso de vários núcleos com a redução da velocidade da tarefa ou a alteração da prioridade da tarefa. Isso permitirá que você termine a tarefa mais rapidamente, mas saia do caminho de outros processos.