Diminua a velocidade de apenas um processo para regular a temperatura da CPU

9
  1. Eu tenho um programa Quando está em execução, a temperatura da CPU aumenta de 50 para 80 graus Celsius, o que é minha maior preocupação.

    Posso controlar a frequência da CPU para diminuir a velocidade, mas outros processos também serão mais lentos, o que não quero.

    É possível desacelerar um processo específico sem afetar outros processos para manter a CPU fria?

    Meu sistema operacional é o Ubuntu 10.10.

  2. Tentei definir a prioridade do processo nice -n 15 myprograme não tenho certeza se isso funcionará. A CPU tem 77 Celcius de altura.

    Não nicesó definir a prioridade relativa de um processo WRT outros processos? Ou seja, se outros processos não estiverem em execução, esse processo ordenado será executado rapidamente? Eu gostaria de definir o processo como lento durante todo o processo.

Tim
fonte
11
O que esse processo faz: entrada / saída pesada? Cálculos pesados ​​na CPU principal? Cálculos pesados ​​na GPU (placa de vídeo) (geralmente mas não se limitando a programas que calculam imagens)?
Gilles 'SO- stop be evil'
O programa é pdf2djvu, convertendo um arquivo pdf em djvu. É IO pesado ou CPU pesada ou GPU pesada? Você tem maneiras diferentes para casos diferentes?
Tim
4
80º é muito, muito alto. Eu moro em um lugar quente da Espanha e a temperatura máxima do meu processador é de ~ 60º. Abra o computador, limpe todas as peças e troque os refrigeradores. Eu acho que o seu não é o uso da CPU.
Rufo El Magufo 17/08/11
Tente fazer as duas coisas.
stribika
80 ° é realmente alto, mas não é considerado extremo, dependendo do modelo da CPU. mais suporte CPU até 90 ° C sem problema
kiwy

Respostas:

16

CPULimit é exatamente o que você precisa. Você inicia o programa e executa cpulimit no nome do programa ou no PID, especificando a porcentagem que você deseja que seja limitada.

O comando a seguir limita o processo no PID 7777 a 5% de uso da CPU.

cpulimit -p 7777 -l 5

Como alternativa, você pode usar o nome do executável:

cpulimit -e myprogram -l 5

Ou o caminho absoluto do executável:

cpulimit -P /path/to/myprogram -l 5

Observe que a porcentagem é de todos os núcleos; então, se você tiver 4 núcleos, poderá usar 400%.

laebshade
fonte
11
Obrigado! (1) O CPULimit é usado apenas para o processo já em execução? Não é usado ao enviar um programa para execução? (2) fixa a porcentagem de uso da CPU por um processo ou define o limite superior para o processo e permite que seu uso flutue entre 0 e esse limite de acordo com outros processos? (3) Também descobri que depois de usar o CPULimit em um processo, não há como Ctrl + C cancelar a execução, porque em breve ela voltará a funcionar automaticamente. Imagino por que?
Tim
2
Uma pequena ressalva sobre o CPULimit: ele usa SIGSTOP / SIGCONT para limitar a quantidade de tempo de CPU usada por um processo (processos que excedem o uso de CPU de destino são interrompidos; quando o tempo é passado, o processo recebe um SIGCONT e retoma a execução). No entanto, existem casos raros em que os sinais podem interferir nas chamadas do sistema, consulte o manual da biblioteca GNU C para obter detalhes. Como o CPULimit envia esses sinais muitas vezes por segundo, há várias chances de interrupção. Não é um grande problema para executar o pdftk em uma área de trabalho.
Riccardo Murri
8

Você pode renomear um processo em execução para dar mais ou menos prioridade (o chamado "bom valor"). Observe que a escala de prioridade do UNIX é um tanto contra-intuitiva: valores negativos significam que um processo é favorecido em relação a processos simultâneos, ou seja, tem "mais" prioridade.

Assim, você pode tentar "desacelerar" seu processo, devido ao seu PID por meio de:

# lower priority of a process
renice +1 "PID"

Toda vez que você executa isso, o processo "bom valor" é aumentado em 1; você pode usar valores inteiros que não sejam, é +1claro.

O comando nice permite iniciar um processo com um ajuste de 10 valores legais (altere isso com a opção -n). Por exemplo:

# start a CPU-intensive task with low priority
nice ./cpu-hog

No entanto, o "bom valor" afeta apenas o quanto o agendador favorece a execução de um processo específico em detrimento de outros no sistema: se o computador estiver basicamente ocioso, aumentar o "bom valor" de um único processo não impedirá que esse processo tome 100% CPU. Cito a página de manual getpriority (2) : (Ênfase adicionada por mim.)

O grau em que seu valor legal relativo afeta o agendamento de processos varia entre os sistemas Unix e, no Linux, entre as versões do kernel. A partir do kernel 2.6.23, o Linux adotou um algoritmo que faz com que diferenças relativas em valores agradáveis ​​tenham um efeito muito mais forte. Isso faz com que valores agradáveis ​​muito baixos (+19) forneçam realmente pouca CPU a um processo sempre que houver outra carga _ de maior prioridade no sistema._

O motivo disso reside na maneira como os processos são executados em um kernel do tipo UNIX: toda vez que o kernel decide executar um processo, esse processo tem controle total do núcleo da CPU por um certo período de tempo (fixo e curto). O "bom valor" pode influenciar a frequência com que o agendador do kernel está disposto a atribuir um intervalo de tempo a um processo, mas você não pode alterar o fato de que, uma vez agendado, um processo é executado sem perturbações por um período fixo de tempo.

Portanto, além de diminuir a velocidade da CPU, não há como tornar o processo mais lento se não houver outros processos no sistema que possam competir pelo acesso à CPU.

Riccardo Murri
fonte
Obrigado! É possível tornar o processo lento desde o início até o final, independentemente de outros processos?
Tim
@ Tim Não acho que o que você pede é possível; Atualizei a resposta com mais detalhes. Espero que isso torne mais claro.
Riccardo Murri
11
A outra resposta sugeriu CPULimit, que parece fazer a coisa impossível.
Tim
Ah, eu não sabia sobre o CPULimit - ele definitivamente preenche uma lacuna no meu conjunto de ferramentas UNIX.
Riccardo Murri
nicenão fará nada para manter o processador frio. Não foi projetado para funcionar assim.
Ken afiada
4

Os cgroups foram criados exatamente por esse motivo.

http://www.kernel.org/doc/Documentation/cgroups/ http://www.serverwatch.com/tutorials/article.php/3921001/Setting-Up-Linux-Cgroups.htm

Demora um pouco para se familiarizar com eles, e acredito que você precisa de acesso root para configurá-los, mas tudo pode ser script. O Ubuntus mais recente possui um arquivo .conf para que você não precise escrever seu próprio script. Eu não tenho certeza sobre 10.10.

Um bom lugar para começar é nesta resposta: https://askubuntu.com/a/94743/170177

Note que o cgroups ainda está em desenvolvimento ativo, então alguns recursos podem não estar disponíveis no seu kernel atual.

Usar o cpu.shares do cgroups não faz nada que um bom valor não faria. Parece que você deseja realmente acelerar os processos, o que definitivamente pode ser feito.

Você precisará usar um script ou dois e / ou editar o /etc/cgconfig.conf para definir os parâmetros desejados.

Especificamente, você deseja editar os valores cpu.cfs_period_us e cpu.cfs_quota_us . O processo irá então ser permitido correr para cpu.cfs_quota_us microssegundos por cpu.cfs_period_us microssegundos.

Por exemplo:

Se cpu.cfs_period_us = 50000 e cpu.cfs_quota_us = 10000 , o processo receberá 20% do tempo máximo da CPU, não importa o que esteja acontecendo.

Nesta captura de tela, eu dei ao processo 2% do tempo da CPU:

2% de tempo de CPU

No que diz respeito ao processo, ele está funcionando a 100%.

As configurações cpu.shares, por outro lado, podem e ainda usarão 100% do tempo ocioso da CPU.

Neste exemplo semelhante, eu dei o processo cpu.shares = 100 (de 1024):

cpu.shares

Como você pode ver, o processo ainda está consumindo todo o tempo ocioso da CPU.

Referências:

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups .html

Ken Sharp
fonte
Nota: systemdfaz as coisas um pouco diferentes. O Ubuntu Trusty, por exemplo, parece vir com dois serviços para gerenciar cgroups. Vou atualizar quando souber mais.
Ken Sharp
Mas você pode alterar o% cpu máximo quando o processo já estiver iniciado, como renice?
Marco Sulla
renicenão altera a quantidade de CPU usada, apenas altera a prioridade do processo no planejador. O cgroups pode alterar o limite da CPU a qualquer momento. Desde que esta resposta foi publicada, o cgroups teve todos os tipos de ajustes adicionados e é muito poderoso.
Ken Sharp
renice does not change the amount of CPU usesEu sei;) Acabei de publicar como exemplo de um programa que muda as coisas em tempo de execução. Obrigado pela sua resposta, vou tentar cgroups.
Marco Sulla