Ralentissez un seul processus pour réguler la température du processeur

9
  1. J'ai un programme. Lorsqu'il fonctionne, la température du processeur passe de 50 à 80 Celcius, ce qui est ma principale préoccupation.

    Je peux contrôler la fréquence du processeur pour le ralentir, mais d'autres processus seront également ralentis, ce que je ne veux pas.

    Est-il possible de ralentir un processus particulier sans affecter d'autres processus pour garder le CPU au frais?

    Mon système d'exploitation est Ubuntu 10.10.

  2. J'ai essayé de définir la priorité du processus par nice -n 15 myprogram, et je ne sais pas si cela fonctionnera. Le CPU a une hauteur de 77 Celcius.

    Ne nicedéfinit- elle que la priorité relative d'un processus par rapport aux autres processus? Autrement dit, si d'autres processus ne sont pas en cours d'exécution, est-ce que ce processus en réseau fonctionnera rapidement? Je voudrais que le processus s'exécute lentement tout au long.

Tim
la source
1
Que fait ce processus: entrée / sortie lourde? Des calculs lourds sur le CPU principal? Calculs lourds sur le GPU (carte vidéo) (généralement mais non limité aux programmes qui calculent les images)?
Gilles 'SO- arrête d'être méchant'
Le programme est pdf2djvu, convertissant un fichier pdf en djvu. Est-ce un IO lourd, un CPU lourd ou un GPU lourd? Avez-vous différentes manières pour différents cas?
Tim
4
80º est très très élevé. Je vis dans un endroit chaud d'Espagne et la température maximale de mon processeur est d'environ 60 °. Ouvrez l'ordinateur, nettoyez toutes les pièces et changez les refroidisseurs. Je pense que ce n'est pas l'utilisation du processeur.
Rufo El Magufo
Essayez de faire les deux.
stribika
80 ° est en fait élevé mais n'est pas considéré comme extrême selon le modèle de CPU. la plupart des CPU supportent jusqu'à 90 ° C sans problème
Kiwy

Réponses:

16

CPULimit est exactement ce dont vous avez besoin. Vous démarrez le programme, puis exécutez cpulimit par rapport au nom du programme ou PID, en spécifiant le pourcentage que vous souhaitez qu'il soit limité.

La commande suivante limite le processus du PID 7777 à 5% d'utilisation du processeur.

cpulimit -p 7777 -l 5

Alternativement, vous pouvez utiliser le nom de l'exécutable:

cpulimit -e myprogram -l 5

Ou le chemin absolu de l'exécutable:

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

Notez que le pourcentage est de tous les cœurs; donc si vous avez 4 cœurs, vous pouvez utiliser 400%.

abat-jour
la source
1
Merci! (1) CPULimit est-il uniquement utilisé pour le processus déjà exécuté? Non utilisé lors de la soumission d'un programme à exécuter? (2) fixe-t-il le pourcentage d'utilisation du CPU par un processus, ou fixe-t-il la limite supérieure du processus et permet-il que son utilisation fluctue entre 0 et cette limite en fonction d'autres processus? (3) J'ai également constaté qu'après avoir utilisé CPULimit sur un processus, il n'y avait aucun moyen de Ctrl + C pour annuler l'exécution, car il reviendrait bientôt pour s'exécuter automatiquement. Se demander pourquoi?
Tim
2
Une petite mise en garde à propos de CPULimit: il utilise SIGSTOP / SIGCONT pour limiter la quantité de temps CPU utilisée par un processus (les processus dépassant l'utilisation CPU cible sont arrêtés; quand suffisamment de temps s'est écoulé, le processus est envoyé un SIGCONT et reprend l'exécution). Cependant, il existe de rares cas dans lesquels les signaux peuvent interférer avec les appels système, voir le manuel de la bibliothèque GNU C pour plus de détails. Puisque CPULimit envoie ces signaux plusieurs fois par seconde, il y a tout à fait une chance d'interrompre. Pas un gros problème pour exécuter pdftk sur un bureau, tho.
Riccardo Murri
8

Vous pouvez redéfinir un processus en cours d'exécution pour lui donner plus ou moins de priorité (la soi-disant "belle valeur"). Notez que l'échelle de priorité UNIX est quelque peu contre-intuitive: des valeurs négatives signifient qu'un processus est préféré aux processus concurrents, c'est-à-dire qu'il a une priorité "plus".

Vous pouvez ainsi essayer de "ralentir" votre processus grâce à son PID à travers:

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

Chaque fois que vous exécutez ceci, le processus "nice value" est augmenté de 1; vous pouvez utiliser des valeurs entières autres que +1bien sûr.

La commande nice vous permet de démarrer un processus avec un ajustement de valeur +10 (changez-le avec l'option -n). Par exemple:

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

Cependant, la "valeur agréable" n'affecte que la mesure dans laquelle le planificateur favorise l'exécution d'un processus particulier par rapport aux autres dans le système: si votre ordinateur est essentiellement inactif, augmenter la "valeur agréable" d'un seul processus n'empêchera pas ce processus de prendre 100% CPU. Je cite la page de manuel getpriority (2) : ( Je souligne .)

La mesure dans laquelle leur valeur relative relative affecte la planification des processus varie selon les systèmes Unix et, sous Linux, entre les versions du noyau. À partir du noyau 2.6.23, Linux a adopté un algorithme qui fait que les différences relatives de belles valeurs ont un effet beaucoup plus fort. Cela provoque de très faibles valeurs agréables (+19) pour fournir vraiment peu de CPU à un processus chaque fois qu'il y a une autre charge de priorité plus élevée sur le système.

La raison de cela réside dans la façon dont les processus sont exécutés sur un noyau de type UNIX: chaque fois que le noyau décide d'exécuter un processus, ce processus a le contrôle total d'un cœur de processeur pendant une certaine période (fixe et courte). La "valeur intéressante" peut influencer la fréquence à laquelle le planificateur du noyau est disposé à donner un créneau horaire à un processus, mais vous ne pouvez pas changer le fait qu'une fois planifié, un processus s'exécute sans être perturbé pendant une durée fixe.

Par conséquent, à moins de ralentir votre CPU, il n'y a aucun moyen de ralentir un processus s'il n'y a aucun autre processus dans le système qui peut prétendre à l'accès au CPU.

Riccardo Murri
la source
Merci! Est-il possible de ralentir un processus du début à la fin, quels que soient les autres processus?
Tim
@Tim Je ne pense pas que ce que vous demandez soit possible; J'ai mis à jour la réponse avec plus de détails. J'espère que cela le rend plus clair.
Riccardo Murri
1
L'autre réponse suggérait CPULimit, qui semble faire l'impossible.
Tim
Ah, je ne connaissais pas CPULimit - il comble définitivement une lacune dans mon ensemble d'outils UNIX.
Riccardo Murri
nicene fera rien pour garder votre processeur au frais. Il n'est pas conçu pour fonctionner comme ça.
Ken Sharp
4

cgroups ont été créés exactement pour cette raison.

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

Cela prend un peu de temps pour vous familiariser avec eux, et je pense que vous avez besoin d'un accès root pour les configurer, mais tout peut être scripté. Les Ubuntus plus récents ont un fichier .conf afin que vous n'ayez pas à écrire votre propre script. Je ne suis pas sûr de 10h10.

Un bon endroit pour commencer est dans cette réponse: https://askubuntu.com/a/94743/170177

Notez que cgroups est toujours en cours de développement, donc certaines fonctionnalités peuvent ne pas être disponibles dans votre noyau actuel.

L'utilisation de cpu.shares de cgroups ne fait rien qu'une valeur intéressante ne ferait pas. Il semble que vous souhaitiez réellement limiter les processus, ce qui peut certainement être fait.

Vous devrez utiliser un ou deux scripts et / ou modifier /etc/cgconfig.conf pour définir les paramètres souhaités.

Plus précisément, vous souhaitez modifier les valeurs cpu.cfs_period_us et cpu.cfs_quota_us . Le processus sera alors autorisé à s'exécuter pendant cpu.cfs_quota_us microsecondes par cpu.cfs_period_us microsecondes.

Par exemple:

Si cpu.cfs_period_us = 50000 et cpu.cfs_quota_us = 10000, le processus recevra 20% du temps processeur maximum, quoi qu'il se passe d'autre.

Dans cette capture d'écran, j'ai donné au processus 2% du temps CPU:

2% de temps CPU

En ce qui concerne le processus, il fonctionne à 100%.

Les paramètres cpu.shares , d'autre part, peuvent et utiliseront toujours 100% du temps processeur inactif.

Dans cet exemple similaire, j'ai donné le processus cpu.shares = 100 (sur 1024):

cpu.shares

Comme vous pouvez le voir, le processus consomme toujours tout le temps processeur inactif.

Références:

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
la source
Remarque: systemdfait les choses un peu différemment. Ubuntu Trusty, par exemple, semble venir avec deux services pour gérer les groupes de contrôle. Je mettrai à jour quand j'en saurai plus.
Ken Sharp
Mais vous pouvez modifier le max cpu% lorsque le processus est déjà démarré, comme renice?
Marco Sulla
renicene modifie pas la quantité de CPU utilisée, elle modifie simplement la priorité du processus dans le planificateur. cgroups peut modifier la limite du processeur à tout moment. Depuis que cette réponse a été publiée, les groupes de contrôle ont été ajoutés à toutes sortes de réglages et sont très puissants.
Ken Sharp
renice does not change the amount of CPU usesJe le sais;) Je viens de publier un exemple de programme qui change les choses au moment de l'exécution. Merci pour votre réponse, je vais essayer les cgroups.
Marco Sulla