Question Comment limiter la consommation du processeur d'un groupe de processus avec des outils GNU / Linux standard?


J'ai un tas de processus du même nom - ils prennent 100% de mon temps CPU, je veux que ce ne soit pas plus de 50%.

Comment puis-je faire cela sans installer de logiciel supplémentaire?


4
2018-05-29 09:01


origine


Voulez-vous limiter chaque processus à 50% d'un processeur ou souhaitez-vous limiter la agrégat Utilisation du processeur de tous ces processus? La réponse pourrait bien dépendre de cette distinction. - Toby Speight
Avez-vous envisagé de définir une affinité de processus pour 50% des cœurs? - PTwr
La plupart du temps, je vois des questions comme celle-ci, je me demande si le PO ne serait pas mieux d'utiliser nice... - Axel


Réponses:


Pour un mécanisme de niveau noyau, vous devez lire sous Linux Groupes de contrôle. C'est un domaine encore en développement actif, vous devez donc vous assurer que ce que vous lisez est cohérent avec le noyau que vous avez (ou êtes prêt à installer).

Bien que vous ayez dit de ne rien installer de plus, vous pourriez envisager d'installer cgred pour automatiser les processus en mouvement avec des noms correspondants à votre groupe de travail CPU. Sur Debian, ceci dans le cgroup-bin paquet.


4
2018-05-29 09:27





Vous pouvez le faire avec les commandes bash shell, sleep, pgrep et pkill en utilisant les signaux STOP et CONT.

La ligne suivante fera que les processus utilisent au maximum 50% du temps CPU total disponible. Il va fonctionner pour chaque 100 millisecondes, puis il sera arrêté pour 100 millisecondes supplémentaires.

while [ True ]; do pkill -STOP processname; sleep 0.1s; pkill -CONT processname; sleep 0.1s; done

Voici le même code divisé en plusieurs lignes pour plus de lisibilité:

while [ True ]
     do pkill -STOP processname
     sleep 0.1s
     pkill -CONT processname
     sleep 0.1s
done

Quelle que soit la quantité de processus utilisés pour le pattern nom_processus, ils ne peuvent pas dépasser 50% de l'utilisation du processeur, car ils sont tous arrêtés et continués en même temps - ce qui signifie qu'ils doivent partager le temps actif. Cela garantit que la limite est atteinte.

Il y a un programme appelé cpulimit qui fait à peu près la même chose.


3
2018-05-29 09:02



L'inconvénient est que cela ne fonctionne pas correctement dans l'état inactif, car vous vous réveillez maintenant 10 fois par seconde, que ce soit nécessaire ou non. Cela diminuera les avantages de NOHZ dans votre noyau. Bien sûr, si votre système n'est jamais inactif, cela ne vous posera pas de problème, mais cela vaut la peine de le mentionner. Voir ma réponse pour une alternative. - Toby Speight
Les processus réagissent parfois bizarrement s'ils sont arrêtés et poursuivis. Surtout s'ils sont interactifs avec le terminal. Cela peut donc ne pas fonctionner avec tous les programmes et un avertissement correspondant doit être inclus dans la réponse. - Alfe


Sans installer aucun logiciel supplémentaire que vous avez nice. La plage de valeurs est de -20 à 19.

nice -20 some_command

donne some_commandla plus haute priorité, et

nice 19 some_command

donne some_commandla priorité la plus basse.


2
2018-05-29 09:04



Si vous agréable un tas de processus, ils n'obtiendront pas 50% du temps CPU lorsque quelque chose d'autre veut utiliser 100% du processeur. - Dmitry Grigoryev
... Et si rien d'autre n'utilise le temps CPU, ils mangent encore tous les 100%. Mais en mentionnant nice dans ce contexte, l'effort en vaut la peine. - Alfe
Pourquoi quelqu'un vouloir un processus pour obtenir 50% de CPU en premier lieu? Je ne peux penser à aucun scénario non ésotérique où cela aurait plus de sens que d'utiliser nice. - Axel
Cela ne me semble pas être un scénario ésotérique car je le rencontre fréquemment. Utilisateurs souhaitant exécuter des tâches de traitement plus importantes, mais ne leur permettant pas d'abattre le reste de la machine en même temps. Un% de limite de CPU serait idéal. - Brian Knoblauch


comme écrit ci-dessus pourrait être utilisé comme un script pour aider OOM-killer ou empêcher son utilisation aussi bien

dire quand le processeur global frappe 75% pour x mins exécutent pkill.sh

 ../scripts/boottime/OOMkiller.sh

while [ true] ; 
    do  inxi -tcm5 > ~/cpu.log 
    sleep 0.5s 
    inxi -tcm5 >> ~/cpu/log | diff -m > ~/offender.log
done

for i in offender.log ;
    do ./scripts/pkill.sh
done

 ../scripts/pkill.sh
while [true] 
    do pgrep $(i) -STOP $PID
    pkill -STOP $PID
    sleep 0.5s 
    pkill -CONT $PID
done

0
2018-05-29 09:39