Je pense que sous Linux, il n'y a pas de solution pour plafonner l'utilisation du processeur, mais il existe un moyen acceptable de limiter tout processus à une certaine utilisation du processeur : http://ubuntuforums.org/showthread.php?t=992706
Au cas où ils supprimeraient l'info, voici à nouveau l'info
-
INSTALLER LES PAQUETS
-
Installer le paquet cpulimit. Code :
sudo apt-get install cpulimit
-
Installer le paquet gawk. Code :
sudo apt-get install gawk
-
CRÉER LE FICHIER DU DÉMON CPULIMIT
Ouvrez un éditeur de texte avec des privilèges Root et sauvegardez le texte du daemon script ci-dessous dans un nouveau fichier /usr/bin/cpulimit_daemon.sh.
Code :
#!/bin/bash
# ==============================================================
# CPU limit daemon - set PID's max. percentage CPU consumptions
# ==============================================================
# Variables
CPU_LIMIT=20 # Maximum percentage CPU consumption by each PID
DAEMON_INTERVAL=3 # Daemon check interval in seconds
BLACK_PROCESSES_LIST= # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited.
WHITE_PROCESSES_LIST= # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited.
# Check if one of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST is defined.
if [[ -n "$BLACK_PROCESSES_LIST" && -n "$WHITE_PROCESSES_LIST" ]] ; then # If both variables are defined then error is produced.
echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty."
exit 1
elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
elif [[ -n "$WHITE_PROCESSES_LIST" ]] ; then # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
else
NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
fi
# Search and limit violating PIDs
while sleep $DAEMON_INTERVAL
do
NEW_PIDS=$(eval "$NEW_PIDS_COMMAND") # Violating PIDs
LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}') # Already limited PIDs
QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$') # PIDs in queue
for i in $QUEUE_PIDS
do
cpulimit -p $i -l $CPU_LIMIT -z & # Limit new violating processes
done
done
- MODIFIER LES VARIABLES EN FONCTION DES BESOINS DE VOTRE ENVIRONNEMENT
CPU_LIMIT Changez cette variable dans le script ci-dessus si vous souhaitez que la consommation du CPU pour chaque processus soit inférieure à 20%. Veuillez lire le chapitre "Si vous utilisez un ordinateur SMP" ci-dessous si vous avez un ordinateur SMP (plus d'un CPU ou un CPU avec plus d'un cœur).
DAEMON_INTERVAL Changez cette variable dans le script ci-dessus si vous souhaitez avoir des vérifications plus ou moins régulières. L'intervalle est en secondes et la valeur par défaut est de 3 secondes.
BLACK_PROCESS_LIST et WHITE_PROCESSES_LIST La variable BLACK_PROCESSES_LIST limite uniquement les processus spécifiés. Si la variable est vide (par défaut), tous les processus en infraction sont limités.
La variable WHITE_PROCESSES_LIST limite tous les processus sauf ceux définis dans cette variable. Si la variable est vide (par défaut), tous les processus en infraction sont limités.
L'une ou les deux variables BLACK_PROCESSES_LIST et WHITE_PROCESSES_LIST doivent être vides - il n'est pas logique que les deux variables soient définies.
Vous pouvez spécifier plusieurs processus dans l'une de ces deux variables en utilisant les caractères de délimitation "|" (sans guillemets doubles). Exemple : si vous souhaitez cpulimiter tous les processus sauf ceux de mysql, firefox et gedit, définissez la variable : WHITE_PROCESSES_LIST="mysql|firefox|gedit"
-
PROCÉDURE POUR DÉMARRER AUTOMATIQUEMENT LE DÉMON AU DÉMARRAGE
-
Définir les autorisations de fichiers pour l'utilisateur Root : Code :
sudo chmod 755 /usr/bin/cpulimit_daemon.sh
-
Ouvrez un éditeur de texte avec les privilèges de Root et enregistrez le script ci-dessous dans le nouveau fichier /etc/init.d/cpulimit.
Code :
#!/bin/sh
#
# Script to start CPU limit daemon
#
set -e
case "$1" in
start)
if [ $(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l) -eq 0 ]; then
nohup /usr/bin/cpulimit_daemon.sh >/dev/null 2>&1 &
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon started successfully"; else print " * cpulimit daemon can not be started" }'
else
echo " * cpulimit daemon can't be started, because it is already running"
fi
;;
stop)
CPULIMIT_DAEMON=$(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l)
CPULIMIT_INSTANCE=$(ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | wc -l)
CPULIMIT_ALL=$((CPULIMIT_DAEMON + CPULIMIT_INSTANCE))
if [ $CPULIMIT_ALL -gt 0 ]; then
if [ $CPULIMIT_DAEMON -gt 0 ]; then
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | xargs kill -9 # kill cpulimit daemon
fi
if [ $CPULIMIT_INSTANCE -gt 0 ]; then
ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | xargs kill -9 # release cpulimited process to normal priority
fi
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon can not be stopped"; else print " * cpulimit daemon stopped successfully" }'
else
echo " * cpulimit daemon can't be stopped, because it is not running"
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
status)
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon is running"; else print " * cpulimit daemon is not running" }'
;;
esac
exit 0
- Changez le propriétaire du fichier en Root :
Code :
sudo chown root:root /etc/init.d/cpulimit
- Modifier les autorisations :
Code :
sudo chmod 755 /etc/init.d/cpulimit
-
Ajouter script aux répertoires de la procédure de démarrage : Code :
sudo update-rc.d cpulimit defaults
-
Redémarrer pour vérifier si script lance le démon cpulimit au démarrage : Code :
sudo reboot
-
VÉRIFIER, ARRÊTER, DÉMARRER ET REDÉMARRER MANUELLEMENT LE DÉMON
Note : Daemon et service dans ce tutoriel ont la même signification.
Note : Pour les utilisateurs utilisant une version antérieure à Ubuntu 8.10 (comme Ubuntu 8.04 LTS), au lieu de la commande service, utilisez la syntaxe "sudo /etc/init.d/cpulimit status/start/stop/restart" ou installez le paquet sysvconfig en utilisant la commande : sudo apt-get install sysvconfig
Vérifier si le service cpulimit est en cours d'exécution Vérifier les retours de commande : "cpulimit daemon is running" si le service est lancé, ou "cpulimit daemon is not running" si le service n'est pas lancé. Code :
sudo service cpulimit status
Démarrer le service cpulimit Vous pouvez démarrer manuellement le démon cpulimit qui commencera à omettre la consommation du CPU. Code :
sudo service cpulimit start
Arrêter le service cpulimit La commande Stop arrête le démon cpulimit (donc aucun nouveau processus ne sera limité) et permet également à tous les processus limités existants d'avoir un accès complet au CPU, comme c'était le cas avant que cpulimit ne fonctionne. Code :
sudo service cpulimit stop
Redémarrer le service cpulimit Si vous modifiez les paramètres de certaines variables dans /usr/bin/cpulimit_daemon.sh comme CPU_LIMIT, DAEMON_INTERVAL, BLACK_PROCESSES_LIST ou WHITE_PROCESSES_LIST, alors après avoir modifié les paramètres vous devez redémarrer le service. Code :
sudo service cpulimit restart
- VÉRIFIER LA CONSOMMATION DE CPU AVEC OU SANS LE DÉMON CPULIMIT
Sans démon 1. arrêter le démon cpulimit (sudo service cpulimit stop) 2. exécutez des tâches gourmandes en CPU en arrière-plan 3. Exécutez la commande : top et vérifiez la colonne %CPU. Le résultat de %CPU est probablement supérieur à 20% pour chaque processus.
Avec le démon activé 1. démarrez le démon cpulimit (sudo service cpulimit start) 2. Exécutez les mêmes tâches intensives en arrière-plan. 3. exécutez la commande : top et vérifiez la colonne %CPU. Le résultat de %CPU doit être de 20% maximum pour chaque processus. Note : N'oubliez pas qu'au début, %CPU peut être supérieur à 20%, car le démon doit attraper les processus en infraction dans un intervalle de 3 secondes (défini dans script par défaut).
- SI UTILISATION D'ORDINATEUR SMP
J'ai testé ce code sur un ordinateur Intel à processeur double cœur - qui se comporte comme un ordinateur SMP. N'oubliez pas que la commande top et aussi cpulimit par défaut se comportent en mode Irix, où 20% signifie 20% d'un CPU. S'il y a deux CPU (ou dual-core), le %CPU total peut être de 200%. Dans la commande top, le mode Irix peut être désactivé avec la commande I (en appuyant sur +i lorsque la commande top est en cours d'exécution) et le mode Solaris est activé, où la quantité totale de CPU est divisée par le nombre de CPU, de sorte que %CPU ne peut être supérieur à 100% sur n'importe quel nombre de CPU. Veuillez lire plus d'informations sur la commande top dans la page de manuel top (recherchez la commande I). Veuillez également lire plus d'informations sur le fonctionnement de cpulimit sur les ordinateurs SMP sur la page officielle de cpulimit.
Mais comment fonctionne le démon cpulimit sur un ordinateur SMP ? Toujours en mode Irix. Ainsi, si vous souhaitez dépenser 20% de la puissance du processeur sur un ordinateur à 2 CPU, alors 40% doit être utilisé pour la variable CPU_LIMIT dans le daemon cpulimit script.
- DÉSINSTALLER LE DÉMON CPULIMIT ET LE PROGRAMME CPULIMIT
Si vous souhaitez vous débarrasser de cpulimit daemon, vous pouvez nettoyer votre système en supprimant cpulimit daemon et en désinstallant le programme cpulimit.
-
Arrêter le démon cpulimit Code :
sudo service cpulimit stop # Stop cpulimit daemon and all cpulimited processes
-
Supprimer le daemon de la procédure de démarrage Code :
sudo update-rc.d -f cpulimit remove # Suppression des liens symboliques
-
Supprimer la procédure de démarrage Code :
sudo rm /etc/init.d/cpulimit # Supprimer cpulimit boot-up script
-
Supprimer le démon cpulimit Code :
sudo rm /usr/bin/cpulimit_daemon.sh # Supprimer le démon cpulimit script
-
Désinstaller le programme cpulimit Code :
sudo apt-get remove cpulimit
-
Désinstaller le programme gawk Si vous n'avez pas besoin de ce programme pour un autre script, vous pouvez le mettre à distance. Code :
sudo apt-get remove gawk
-
NOTE SUR LES AUTEURS
Je viens d'écrire un démon pour cpulimit (scripts bash ci-dessus). Je ne suis pas l'auteur du projet cpulimit. Si vous avez besoin de plus d'informations sur le programme cpulimit, veuillez lire la page web officielle de cpulimit : http://cpulimit.sourceforge.net/ .
Regards, Abcuser
1 votes
Pourquoi est-ce une mauvaise chose? S'ils sont correctement gérés, ils ne devraient pas interférer avec d'autres processus. Ils obtiendront simplement (en effet) tous les cycles restants...
3 votes
En lisant le billet de blog, il semble qu'il veuille que les CPU aient un peu de temps d'arrêt pour ne pas trop chauffer. C'est pourquoi j'ai arrêté de faire SETI@Home - mes CPU ne duraient pas longtemps parce qu'ils chauffaient tout le temps.
0 votes
Oui, je n'ai jamais eu de problème de surchauffe avec un processeur malgré l'utilisation de SETI@Home. Et je n'ai jamais utilisé autre chose que les unités HSF standard fournies avec mes processeurs.
1 votes
Peut-être qu'il est dans un environnement d'hébergement partagé et veut limiter son temps CPU pour que son compte ne soit pas "bloqué"
0 votes
Si ses processus sont correctement reniés, il ne devrait pas impacter les performances des autres. Ses processus n'utiliseront le CPU que lorsqu'il n'est pas utilisé ailleurs.
0 votes
Je ne connais pas la réponse, mais peut-être que vous pouvez regarder l'implémentation de WINE de SetInformationJobObject Windows API
0 votes
Vous pouvez utiliser les cgroups pour y parvenir.
0 votes
@asparagus Avez-vous essayé l'une des solutions ?
0 votes
unix.stackexchange.com/questions/151883/…
0 votes
Faites-en un service systemd puis
systemctl set-property seti.service CPUQuota=50%
Cela utilisera 50% de tous les processeurs.