Nous avons un ordinateur dont le processeur a 32 cœurs et il va être utilisé pour exécuter des programmes par quelques utilisateurs différents. Existe-t-il un moyen de restreindre le nombre de cœurs que chaque utilisateur peut utiliser à tout moment afin qu'un utilisateur ne monopolise pas toute la puissance du processeur?
18
Réponses:
Bien que cela soit possible , c'est compliqué et presque certainement une mauvaise idée. Si un seul utilisateur utilise la machine pour le moment, les limiter à N cœurs est un gaspillage de ressources. Une bien meilleure approche serait de tout faire avec
nice
:Il s'agit d'un excellent outil qui définit la priorité d'un processus. Donc, si un seul utilisateur exécute quelque chose, il obtiendra autant de temps processeur qu'il en aura besoin, mais si quelqu'un d'autre lance son propre travail (également sympa), il sera gentil et partagera les uns avec les autres. De cette façon, si vos utilisateurs lancent tous des commandes avec
nice 10 command
, personne ne monopolisera les ressources (et personne ne mettra le serveur à genoux).Notez qu'une valeur de Nice élevée signifie une faible priorité. C'est une mesure de la façon dont nous devrions être gentils et plus nous sommes gentils, plus nous partageons.
Notez également que cela n'aidera pas à gérer l'allocation de mémoire, cela n'affectera que la planification du processeur. Donc, si plusieurs utilisateurs lancent plusieurs processus gourmands en mémoire, vous aurez toujours un problème. Si c'est un problème, vous devriez examiner les systèmes de mise en file d'attente appropriés tels que le couple .
la source
nice
, d'après ce que vous décrivez, c'est exactement ce dont vous avez besoin.TL; DR : De brèves recherches, il semble qu'il soit possible de restreindre les commandes à un nombre spécifique de cœurs, mais dans tous les cas, vous devez utiliser une commande qui applique réellement la restriction.
groupes de contrôle
Linux a
cgroups
qui est fréquemment utilisé exactement dans le but de restreindre les ressources disponibles pour les processus. À partir d'une très brève recherche, vous pouvez trouver un exemple dans Arch Wiki avec la configuration Matlab (un logiciel scientifique) définie dans/etc/cgconfig.conf
:Pour qu'une telle configuration prenne effet, vous devez exécuter le processus via une
cgexec
commande, par exemple à partir de la même page wiki:ensemble de tâches
Une question connexe sur Ask Ubuntu et comment limiter un processus à un cœur de processeur sous Linux? [duplicate] sur le site Unix et Linux montre un exemple d'utilisation
taskset
pour limiter les processeurs pour le processus. Dans la première question, il est réalisé en analysant tous les processus pour un utilisateur particulierDans l'autre question, un processus est lancé via
taskset
lui-même:Conclusion
Bien qu'il soit certainement possible de limiter les processus, il semble que ce ne soit pas si simple de le faire pour des utilisateurs particuliers. L'exemple dans le post Ask Ubuntu lié nécessiterait une analyse cohérente des processus appartenant à chaque utilisateur et utilisant
taskset
chaque nouveau. Une approche beaucoup plus raisonnable consisterait à exécuter de manière sélective des applications gourmandes en ressources CPU, viacgexec
outaskset
; il est également inutile de restreindre tous les processus à un nombre spécifique de CPUS, en particulier pour ceux qui utilisent réellement le parallélisme et la concurrence pour exécuter leurs tâches plus rapidement - les limiter à un nombre spécifique de CPU peut avoir pour effet de ralentir le traitement. De plus, comme la réponse de Terdon l'a mentionné, c'est un gaspillage de ressourcesL'exécution de certaines applications via
taskset
oucgexec
nécessite de communiquer avec vos utilisateurs pour leur faire savoir quelles applications ils peuvent exécuter, ou la création de scripts d'encapsulation qui lanceront certaines applications viatasksel
oucgexec
.En outre, envisagez de définir le nombre de processus qu'un utilisateur ou un groupe peut générer au lieu de définir une limite sur le nombre de processeurs. Cela peut être réalisé via un
/etc/security/limits.conf
fichier .Voir également
la source
sched_setaffinity(2)
dit que le masque d'affinité est conservé à traversexecve(2)
, et qu'un enfant en héritefork(2)
. Donc, si vous définissez le shell pour un utilisateur (ou leur shell graphique pour une session X), tout ce qu'ils commencent à partir de ce shell utilise par défaut le même masque d'affinité.