Exécuter le processus Linux avec une priorité très très faible?

12

J'ai un processus régulier qui n'est pas si important mais qui consomme tellement de puissance CPU, et j'ai un autre processus qui est vraiment important, mais il passe la plupart du temps inactif, mais quand il a obtenu un emploi, il a vraiment besoin d'une puissance de calcul élevée

J'ai essayé de courir avec nice -20 ./low_priority_processet nice --20 ./high_priority_processmais la priorité inférieure consomme une quantité importante de CPU quand un processus de haute priorité est nécessaire, comment puis-je exécuter un processus qui donnera vraiment ou même une suspension automatique lorsqu'un autre processus utilisant la puissance du CPU

uray
la source
Comment déterminez-vous que le processus hautement prioritaire est réellement nécessaire?
muru
cela engendrera beaucoup de threads, ou le processus consommera le processeur plus de 50% de la capacité du processeur
uray
Utilisez la RRplanification pour le processus de haute priorité.
Ramesh
@Ramesh Quelle différence cela peut-il faire?
Ken Sharp

Réponses:

10

Jetez un oeil à cgroups , il devrait fournir exactement ce dont vous avez besoin - réservations CPU (et plus). Je suggère de lire la priorité de contrôle des applications à l'aide de groupes de contrôle .

Cela dit, mettez les processus importants mais souvent inactifs dans un groupe avec 95% du CPU alloué et vos autres applications dans un autre avec 5% alloués - vous obtiendrez (presque) toute la puissance pour vos travaux en cas de besoin, tandis que le processus gourmand en énergie n'obtiendra au maximum que 5% à ces moments. Lorsque les surtensions de calcul disparaissent, toutes les performances du processeur seront rejetées sur les processus restants. En tant qu'avantage, si vous créez un groupe de contrôle spécial (avec des exigences de performances minimales) pour des processus comme sshd, vous pourrez vous connecter, peu importe ce qui essaie d'obtenir tout le CPU possible - un certain temps CPU sera réservé sshd.

peterph
la source
1
existe-t-il une commande comme cpulimitou nicepour modifier le groupe de processus? parce que si cgroup est un appel d'API, je ne suis pas en mesure de recompiler aucune de ces applications pour utiliser cgroup
uray
Non, vous montez simplement la hiérarchie cgroup quelque part, créez des répertoires par groupe et écrivez des PID de processus dans certains fichiers. Tout cela doit être fait en tant que root (ou, plus précisément avec les privilèges appropriés). Certains systèmes d'initialisation (à savoir systemd, au moins dans certains cas) "volent" l'interface cgroups aux utilisateurs qui doivent utiliser l'interface système d'initialisation (généralement une commande spéciale). Lisez la réponse liée et l'article wikipedia. Vraiment. :)
peterph
Oh, et il y a aussi un libcgrouppaquet, qui est livré avec des utilitaires pour travailler avec des cgrulesengdgroupes de contrôle comprenant un daemon ( ) qui peut réellement trier les processus en groupes en fonction de certaines conditions.
peterph
7

Si la priorité du processus (valeur de Nice) est faible, il n'interrompra pas un processus de priorité plus élevée. La raison pour laquelle vous voyez le processus de faible priorité consomme une quantité importante de CPU lorsque le processus de priorité plus élevée est en cours d' exécution est parce que le processus de priorité plus élevé n'est pas que occupé. Attendant probablement sur IO. Utilisez chrt -p -i 0 $PIDpour exécuter le processus avec une priorité encore plus faible que nice 19 -p $PID(en supposant que nous parlons de Linux ici).

chrt -p -i 0 $PID place le processus dans le "vrai" planificateur inactif.

http://linux.die.net/man/1/chrt

Ken Sharp
la source
2
chrt -p -i 0 $ PID
Robert Foss
chrt n'est toujours pas suffisant. Ce que j'essaie de faire, c'est de regarder des vidéos tout en recodant d'autres vidéos en arrière-plan. L'utilisation de chrt a aidé avec les vidéos youtube mais les mkv de très haute qualité continuent de sauter. Ce que je souhaitais, c'est lire ma vidéo normalement mais utiliser chaque bit de puissance CPU restante pour le réencodage car j'ai un énorme lot à faire.
soger
0

Essayez cet exemple pour exécuter un processus en tant que processus bas.

Si votre travail est sympa tar xvf asets.zip

Utilisation

nice tar xvf assets.zip

Après cela, émettez

haut pour surveiller le processus décompresser avec

ps aux | grep "tar"

Essayez quelque chose de spécifique avec cpulimit

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

cpulimit -l 50 python 0 9999999999> / dev / null &

unixmiah
la source
ouais -20est "basse priorité" et --20est "haute priorité" regardez double tiret pour la nicecommande. et oui, je comprends parfaitement la valeur intéressante, mais ma question est, existe-t-il un moyen de dire au planificateur autre que d'utiliser la valeur agréable
uray
2
@ user77710 êtes-vous sûr? Ni la page de manuel Ubuntu ni la page de manuel POSIX ne spécifient cette syntaxe. Les deux utilisent -n -20, -n 20etc.
muru
ouais quoi que, la syntaxe n'est pas importante, mon point est de définir une belle valeur de très faible et très élevée pour les deux processus ne donne pas le résultat de ce que je voulais
uray
2
@ user77710 QUOI? "la syntaxe n'est pas importante"? Comment pouvez-vous être sûr de définir les valeurs de gentillesse alors?
muru du
parce que je peux voir le processus belle valeur sur htopou topou psou quoi que ce soit
uray
-1

Pour les futurs arrivants, voici un exemple plein de niceavec le stress .

  1. La machine de test dispose de 2 CPU
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2 
On-line CPU(s) list: 0,1
Thread(s) per core:  2
...
  1. Installer stress:apt-get install stress
  2. Occupez les 2 CPU avec un appel de faible priorité pour souligner: nice -20 stress --cpu 2
  3. Vérifiez l'utilisation du processeur avec top:
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15894 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.43 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.42 stress                                                                                    

Cela montre que les deux processeurs sont entièrement occupés.

  1. Lancer un processus de stress à processeur unique avec une priorité élevée: nice --20 stress --cpu 1
  2. Vérifiez à nouveau l'utilisation du processeur avec top
                                                 v
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15928 ubuntu    20   0    8240    100      0 R  99.7  0.0   0:24.02 stress                                                                                    
15894 ubuntu    39  19    8240     96      0 R  51.2  0.0   1:12.46 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  48.8  0.0   1:12.35 stress                                                                                    

Cela montre que le processus de stress à cœur unique obtient son processeur complet, tandis que les processus de priorité inférieure partagent tous les deux le processeur restant

  1. D'un autre côté, tuer tous les stressappels ci - dessus et simplement déclencher un seul processus 3 stress --cpu 3donnerait 66% de CPU à chacun
shadi
la source