cpulimit sur un script bash qui exécute dautres commandes
On février 10, 2021 by adminJai un script bash qui exécute dautres commandes gourmandes en processeur.
Quand japplique cpulimit
sur le script bash, la sortie de top
montre les processus pour les commandes à lintérieur du script toujours exécutés sans limitation par cpulimit
. Je me demande comment je peux limiter lutilisation du processeur des commandes à lintérieur du script bash?
Réponse
Selon cpulimit --help
:
-i, --include-children limit also the children processes
Je nai pas testé si cela sapplique aux enfants denfants, ni regardé comment cela est implémenté.
Vous pouvez également utiliser cgroups
, qui est une fonctionnalité du noyau.
Les groupes de contrôle ne fournissent pas nativement un moyen de limiter les processus enfants également, mais vous pouvez utiliser le démon du moteur de règles cg (cgred) fourni par libcgroup; les commandes cgexec
et cgclassify
qui proviennent du paquet libcgroup fournissent un --sticky
drapeau pour que les règles sappliquent également aux processus enfants.
Sachez quil existe une condition de concurrence qui pourrait (du moins en théorie) entraîner une restriction correcte de certains processus enfants . Cependant, comme vous « utilisez actuellement cpulimit
qui sexécute de toute façon dans lespace utilisateur, vous déjà ne disposez pas de limites de processeur fiables à 100% Donc, cette condition de concurrence ne devrait pas être un facteur décisif pour vous.
Jai beaucoup écrit sur le démon du moteur de règles cg dans ma réponse personnelle ici:
Réponse
Probablement, vous ne pouvez pas « t.
cpulimit
» La logique de s est assez simple, il faut pid de processus et simplement envoyer son signal kill -STOP $PID
, puis kill -CONT $PID
, et encore, et encore, et encore et encore ……
Et mesurer lutilisation du processeur pour calculer le délai entre STOP et CONT.
Dans votre cas, pstree
dun script bash complexe prendrait N * x écrans de console.
Je peux vous suggérer une autre méthode pour rétrograder lutilisation du processeur de tout script bash ou même exécutable binaire.
1) nice
– son processus de prise et en augmentant ou en diminuant sa priorité de -20 (priorité la plus élevée) à 20 (priorité la plus basse). Probablement en diapason trop bas, cest pourquoi, il y a deux autres outils et crochets de noyau:
2) ionice
– peut-être que cest la deuxième génération de nice
. Vous pouvez séparer les processus par priorité de 0 (priorité la plus basse) à 7 (priorité la plus élevée). De plus, vous pouvez séparer les processus par classes, en temps réel (le plus élevé), best-efforts
(milieu), au repos (le plus bas) et aucun (par défaut).
3) chrt
– la chose la plus élevée que jaie jamais rencontrée, elle est similaire à cpulimit
par sa puissance et domination sur le processus. Ici, vous pouvez également rencontrer des classes de priorité, idle
, real-time
, fifo
, batch
, etc … Et diapason des priorités très grandes, de 1 à 99.
Par exemple, vous pourriez lancer un énorme processus avec chrt -r -p 99 process
– et il dévorera toutes vos ressources.
De la même manière, tout énorme démon pourrait fonctionner en « arrière-plan » avec chrt -r -p 0 process
– il attendra tout le monde pendant que les ressources dun système sont occupées.
Quoi quil en soit, je « m vous suggère fortement de lire man chrt
et man ionice
avant de commencer.
Par exemple, je « m utilise rtorrent
pour p2p. Cest la tâche la plus basse pour mon système, alors je la lance de cette manière:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Ou, vous pouvez prendre les hooks & haks way. Et écrivez votre propre script cpulimit_wrapper. Par exemple:
# cat bash_script.sh #!/bin/bash while sleep 0; do find / dd if=/dev/random of=/tmp/random.bin bs=1M count=1000 done
plus
# cat cpulimit.sh #!/bin/bash TARGET=$1 [ -z "$TARGET" ] && echo "Usage bash cpulimit.sh command" && exit 1 cpulimit -l 1 bash $TARGET while sleep 0;do lsof -n -t $TARGET | xargs pstree -p | sed -e "s/(/(\n/g" | sed -e "s/)/\n)/g" | egrep -v "\(|\)" | while read i; do echo $i; cpulimit -l 1 -b -p $i; done done
Réponse
Le meilleur moyen pour moi était maintenant dexécuter un script qui permet cpulimit contrôle les processus en arrière-plan depuis Askubuntu :
#!/bin/bash #The first variable is to set the number of cores in your processor. The reason that the number of cores is important is that you need to take it into consideration when setting cpulimit"s -l option. This is explained on the cpulimit project page (see http://cpulimit.sourceforge.net/): "If your machine has one processor you can limit the percentage from 0% to 100%, which means that if you set for example 50%, your process cannot use more than 500 ms of cpu time for each second. But if your machine has four processors, percentage may vary from 0% to 400%, so setting the limit to 200% means to use no more than half of the available power." NUM_CPU_CORES=$(nproc --all) #Automatically detects your system"s number of CPU cores. cpulimit -e "ffmpeg" -l $((50 * $NUM_CPU_CORES))& #Limit "ffmpeg" process to 50% CPU usage. cpulimit -e "zero-k" -l $((50 * $NUM_CPU_CORES))& #Limit "zero-k" process to 50% CPU usage. cpulimit -e "mlnet" -l $((50 * $NUM_CPU_CORES))& #Limit "mlnet" process to 50% CPU usage. cpulimit -e "transmission-gtk" -l $((50 * $NUM_CPU_CORES))& #Limit "transmission-gtk" process to 50% CPU usage. cpulimit -e "chrome" -l $((40 * $NUM_CPU_CORES))& #Limit "chrome" process to 40% CPU usage.
Modifier les processus utilisé dans votre script et laissez-le sexécuter. cpulimit sexécutera en arrière-plan et surveillera les processus demandés et limitera son utilisation. Si lun des processus est terminé, cpulimit restera et limiter les processus sils reviennent un jour.
(Jai rencontré un problème étrange si jessayais dexécuter ffmpeg via une boucle for dans le terminal. Cela a paradoxalement engendré deux instances ffmpeg qui ont rendu cpulimit presque u seless. Je nai pas pu trouver de réponse à la nature du problème. Donc, même si ce nest « quune boucle for », vous devrez peut-être écrire un script pour ce.)
Réponse
Utilisez le paramètre -P
et placez le chemin absolu avant le exécutable.
Réponse
Jai essayé de configurer un alias pour cpulimit -l 50 ffmpeg
dans .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
puis je lai utilisé dans mon script avec le code suivant pour les alias de source
shopt -s expand_aliases source /home/your_user/.bashrc
Maintenant, je peux utiliser cpulimit avec ffmpeg nimporte où dans le script pour plusieurs commandes utilisant lalias. Testé sur linux scientifique 6.5. Fonctionne parfaitement.
Commentaires
- malheureusement, la commande cpulimit passe ensuite en arrière-plan, rendant impossible la création de scripts itératifs
- Jai également rencontré ceci; comme solution de contournement si les itérations ne sont pas très complexes, en utilisant une combinaison de ‘ find ‘ redirigé vers ‘ xargs ‘ a fait le travail pour moi.
Laisser un commentaire