J'exploite un système Linux qui compte de nombreux utilisateurs mais parfois un abus. où un utilisateur peut exécuter un processus unique qui utilise plus de 80% de la CPU / mémoire.
Y a-t-il un moyen d'éviter cela en limitant l'utilisation d'un processeur qu'un processus peut utiliser (à 10% par exemple)? Je suis au courant cpulimit
, mais malheureusement, la limite est appliquée aux processus que je lui demande de limiter (processus uniques, par exemple). Ma question est donc la suivante: comment puis-je appliquer la limite à tous les processus en cours et aux processus qui seront exécutés à l'avenir sans avoir besoin de fournir leur identifiant / chemin par exemple?
centos
command-line
cpu
limit
Giovanni Mounir
la source
la source
cpulimit
en conjonction avec votre script de recherche. Adoptez une stratégie et recommandez l'utilisation decpulimit
, puis recherchez plus de 10%, puis limitez-le à 5% (les utilisateurs sont donc encouragés à l'utilisercpulimit
). Assurez-vous également que vous pouvez détecter plusieurs processus totalisant plus de 10% pour un seul utilisateur.cpulimit
est bien meilleure que de simplement tuer le processus car il peut être redémarré par l'utilisateur ultérieurement (comme indiqué dans l'un de vos commentaires). Merci!Réponses:
Bien que cela puisse être un abus de mémoire, ce n’est pas le cas de la CPU: quand une CPU est inactive, un processus en cours (par "running", je veux dire que le processus n’attend pas d’E / S ou autre chose) prendra 100% de temps CPU par défaut. Et il n'y a aucune raison d'imposer une limite.
Maintenant, vous pouvez définir des priorités grâce à
nice
. Si vous souhaitez qu’ils s’appliquent à tous les processus d’un utilisateur donné, vous devez simplement vous assurer que son shell de connexion est exécuté avecnice
: les processus enfants hériteront de lanice
valeur. Cela dépend de la manière dont les utilisateurs se connectent. Voir Priorité aux connexions SSH (nice) par exemple.Vous pouvez également configurer des machines virtuelles. En effet, définir une limite par processus n'a pas beaucoup de sens puisque l'utilisateur peut démarrer plusieurs processus en abusant du système. Avec une machine virtuelle, toutes les limites seront globales pour la machine virtuelle.
Une autre solution consiste à fixer des
/etc/security/limits.conf
limites. reportez-vous à la page de manuel limits.conf (5). Par exemple, vous pouvez définir le temps CPU maximum par login et / ou le nombre maximum de processus par login. Vous pouvez également définirmaxlogins
sur 1 pour chaque utilisateur.la source
gentil / renice
nice
est un excellent outil pour apporter des modifications ponctuelles à un système.cpulimit
cpulimit
si vous avez besoin d'exécuter un travail gourmand en ressources processeur et qu'il vous est nécessaire de disposer d'un temps processeur suffisant pour la réactivité du système.cgroups
cgroups
appliquer des limites à un ensemble de processus plutôt qu'à un seulRessources
http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups
la source
cpu.cfs_quota_us
paramètre (voir le manuel )sudo cgclassify -g cpu:cpulimited 2315444
Avez-vous regardé cgroups? Il y a quelques informations sur Arch Wiki à leur sujet. Lisez la section
cpu.shares
intitulée «On dirait qu’elle répond à vos besoins et qu’elle peut fonctionner au niveau de l’utilisateur, ce qui vous permet de limiter tous les processus en même temps.la source
Pour mémoire, ce que vous recherchez est
ulimit -v
. Notez que celaulimit
est hérité par les processus enfants. Par conséquent, si vous l'appliquez au shell de connexion de l'utilisateur au moment de la connexion, il s'applique à tous ses processus.Si tous vos utilisateurs utilisent
bash
comme shell de connexion, la ligne suivante/etc/profile
devrait entraîner une limite stricte de 1 Go pour tous les processus utilisateur (plus précisément, un million de kilo-octets):L'option
H
garantit que la limite est stricte, c'est-à-dire que l'utilisateur ne peut pas la configurer par la suite. Bien entendu, l'utilisateur peut toujours remplir sa mémoire en démarrant suffisamment de processus à la fois.Pour les autres shells, vous devrez trouver quels fichiers d’initialisation ils lisent à la place (et quelle autre commande au lieu de
ulimit
leur utilisation).Pour le processeur, ce que vous souhaitez n'a pas de sens pour moi. Quelle serait l'utilisation de laisser 90% de la CPU inutilisée lorsqu'un seul processus est en cours d'exécution? Je pense que ce que vous voulez vraiment est
nice
(et éventuellementionice
). Notez que, commeulimit
, lesnice
valeurs sont héritées par les processus de l' enfant, afin de l' appliquer à l'interpréteur de commandes à temps suffit de connexion. Je suppose que cela s'applique également à,ionice
mais je ne suis pas sûr.la source
nice
sera assez gentil de faire cela? Si oui, croyez-vous pouvoir me montrer un exemple pour y parvenir?Puisque vous dites que cpulimit ne serait pas pratique dans votre cas, je vous suggère donc de regarder nice , renice et taskset , ce qui peut se rapprocher de ce que vous souhaitez atteindre, bien que taskset permette de définir l'affinité de traitement d'un processus. pourrait ne pas être immédiatement utile dans votre cas.
la source
nice
etrenice
? C'est bien! J'ai consulté leurs pages de manuel, mais je ne pense toujours pas qu'ils puissent vous aider car vous devez toujours définir un ID de processus. Si vous pouviez cependant me donner un exemple impliquant ces paquets d'appliquer la limite sur tous les processus en cours / futurs, ce serait génial!Depuis que vos tags ont
centos
, vous pouvez utilisersystemd
.Par exemple, si vous souhaitez limiter les utilisateurs avec l'ID suivant
1234
:sudo systemctl edit --force user-1234.slice
Puis tapez et enregistrez ceci:
[Slice] CPUQuota=10%
La prochaine fois que cet utilisateur se connectera, cela affectera.
Man pages:
systemctl
,systemd.slice
,systemd.resource-control
...la source
Si vous souhaitez limiter les processus déjà démarrés, vous devrez le faire un par un par PID, mais vous pouvez utiliser un script de traitement par lots comme celui-ci:
Dans mon cas
pypdfocr
lance le gourmandtesseract
.De plus, dans certains cas, si votre CPU est assez bon, vous pouvez simplement utiliser
renice
ceci:la source