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.


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%.


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.