Combien de cœurs j'utilise sur un serveur Linux?

30

Je me demande simplement comment savoir en bash combien de cœurs de processeur un utilisateur utilise actuellement sur un serveur Linux?

Je soumets une bonne quantité de travaux d'arrière-plan au serveur, je voudrais donc écrire un script bash pour vérifier avant de soumettre un travail si les travaux (processus) en cours soumis par moi sont trop nombreux, car je dois laisser d'autres les utilisateurs ont suffisamment de cœurs à utiliser pour leur travail. Je voudrais savoir quelle commande bash peut me dire combien de cœurs mes tâches utilisent actuellement.

Merci et salutations!

Tim
la source

Réponses:

39

Pour obtenir le nombre de cœurs de processeur par processeur:

grep "^core id" /proc/cpuinfo | sort -u | wc -l

Ou pour obtenir le nombre de CPU physiques :

grep "^physical id" /proc/cpuinfo | sort -u | wc -l
Alix Axel
la source
comment vérifier cela pour un utilisateur donné?
makis
26

Je ne sais pas si cela aide, mais vous pouvez utiliser l' mpstatutilitaire pour obtenir une ventilation de l'utilisation du processeur par processeur individuel (ou cœur). Par exemple:

$ mpstat -P ALL 1

12:49:59 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
12:50:00 PM  all    7.89    0.00    1.25    0.88    0.00    0.00    0.00   89.97   1359.00
12:50:00 PM    0   14.00    0.00    0.00    0.00    0.00    0.00    0.00   86.00   1043.00
12:50:00 PM    1   15.84    0.00    7.92    3.96    0.00    0.99    0.00   71.29    297.00
12:50:00 PM    2    3.96    0.00    0.00    1.98    0.00    0.99    0.00   93.07      0.00
12:50:00 PM    3    3.96    0.00    0.99    2.97    0.00    0.00    0.00   92.08      0.00
12:50:00 PM    4    4.00    0.00    0.00    0.00    0.00    0.00    0.00   96.00      0.00
12:50:00 PM    5    4.95    0.00    0.99    0.00    0.00    0.00    0.00   94.06     18.00
12:50:00 PM    6   10.89    0.00    0.99    0.00    0.00    0.00    0.00   88.12      0.00
12:50:00 PM    7    5.05    0.00    0.00    0.00    0.00    0.00    0.00   94.95      0.00

Dans cet exemple, vous pouvez voir que CPU 0, 1et 6font plus de travail que le reste d'entre eux. Parfois, vous verrez qu'un seul processeur est proche (ou à) de 100% tandis que d'autres sont à zéro. Cela peut être un indicateur d'un programme (ou d'une partie d'un programme) qui est monothread et ne peut utiliser qu'un seul processeur à la fois.

Pour installer mpstatsur un système Fedora, RHEL ou CentOS, utilisez yum install sysstat.

Matt Solnit
la source
Merci mille fois d'avoir fourni cette réponse! Mes collègues utilisaient la commande "top" et tiraient toutes les mauvaises conclusions sur l'utilisation du processeur jusqu'à ce que je leur montre la commande mpstat.
Nav
Non disponible sur Ubuntu: # aptitude search mpstat #.
Alix Axel
2
@AlixAxel essayez à la aptitude search systatplace.
Matt Solnit
@MattSolnit: toujours pas de chance.
Alix Axel
mpstat est fourni par le paquet sysstat sur Debian et sur Ubuntu . Je m'attendrais à ce que la plupart des distributions dérivées de Debian utilisent le même nom de paquet. Sur les distributions dérivées de Debian, commencez par apt-cache search --full mpstat.
un CVn
2

À moins qu'ils ne soient explicitement configurés pour ne pas (c'est-à-dire épingler un processus à un processeur spécifique), tous les cœurs peuvent être supposés être utilisés à tout moment. Le planificateur allouera les processus au prochain noyau disponible. Par exemple, "System Monitor" (une partie de GNOME) montre ma charge presque la même sur les 4 cœurs de ma machine.

EmmEff
la source
Je soumets une bonne quantité de travaux en arrière-plan au serveur, donc j'aime écrire un script bash pour vérifier avant de soumettre un travail si les travaux (processus) en cours soumis par moi sont trop nombreux, car je dois laisser les autres utilisateurs avoir assez de cœurs à utiliser pour leur travail. Donc j'aime savoir quelle commande bash peut me dire combien de cœurs mes jobs utilisent actuellement.
Tim
3
Je ne pense pas que vous ayez compris ma réponse. Le nombre de cœurs utilisés est TOUJOURS le nombre total de cœurs disponibles. Utilisez la charge globale du système comme facteur pour déterminer si votre soumission de travail doit être limitée ou non.
EmmEff
Merci! Je vérifie la charge globale du système. Un de mes collègues m'a dit que je ne pouvais pas utiliser tous les cœurs, car qui sait que d'autres exécuteront bientôt leur travail et mes travaux dureront longtemps. Pensez-vous également que je dois limiter les cœurs que j'utilise?
Tim
2

Vous verrez donc ici des réponses qui vous diront comment vos cœurs sont utilisés.

CEPENDANT - cela ne vous rend pas vraiment service. Vous avez fait une supposition de base qui ne tient tout simplement pas - que vos travaux auront tendance à se regrouper sur un sous-ensemble des cœurs.

Au lieu de cela, vos tâches seront réparties sur tous les cœurs, à moins que vous n'implémentiez quelque chose qui les maintienne "parqués" d'une manière ou d'une autre. (Remarque: je ne recommande pas cela; je dis simplement "à moins que")

Voici une stratégie alternative: Identifiez pour votre système particulier quel est le niveau de CHARGE lorsque vous pensez qu'il est "acceptable" pour que d'autres utilisateurs ajoutent plus de tâches. Ensuite, créez quelque chose qui ne soumet une nouvelle tâche en arrière-plan que lorsque le niveau de charge est inférieur à cette limite.

De cette façon, la solution sera indépendante du nombre de cœurs, plus portable, plus flexible et plus facile à "peaufiner" également.

pbr
la source
Je viens de remarquer un commentaire que vous avez ajouté à la réponse d'une autre affiche, indiquant que c'est à cause de quelque chose qu'un collègue vous a dit. Ainsi, en effet, il semble que l'idée fausse soit la sienne, pas la vôtre. Désolé pour ça!
1er
Merci! Quant à «Identifier pour votre système particulier quel est le niveau de CHARGE lorsque vous sentez qu'il est« acceptable »que d'autres utilisateurs ajoutent plus de travaux», si la charge actuelle n'est pas principalement causée par mes travaux en cours, alors je me sentirais plus libre d'utiliser les autres processeurs, mais si dans la charge actuelle mes travaux en cours prennent une bonne quantité, je dois probablement abandonner l'utilisation des autres processeurs. Pensez-vous toujours que je n'ai pas à estimer l'utilisation du processeur de mes travaux en cours?
Tim
Non, je ne pense vraiment pas qu'il soit logique de distinguer la part de la charge actuelle de vos emplois par rapport à d'autres emplois. Considérez la simplicité: votre travail essaie d'être un bon citoyen et ne se soumet que si la charge est inférieure à un niveau que vous jugez acceptable. L'idée n'est JAMAIS d'utiliser toute la capacité restante; qui laisse d'autres futurs utilisateurs dans une impasse. Idéalement, tous les utilisateurs utiliseraient la même logique pour cela.
pbr
2

Si vous voulez le faire pour qu'il fonctionne sur Linux et OS X, vous pouvez faire:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
la source
1

Vous pouvez obtenir une estimation approximative en exécutant top, en appuyant sur ' U' et en spécifiant votre nom d'utilisateur, puis en additionnant l'utilisation du processeur de vos premiers processus.

dmckee
la source
J'aime connaître une commande bash qui peut me donner le nombre, car je veux l'utiliser dans un script bash.
Tim
@Tim toppeut s'exécuter en mode batch avec le commutateur -b. Combinez-le avec le commutateur -n pour obtenir le nombre d'itérations dont vous avez besoin.
nagul
1
pouvez-vous donner un exemple de code pour obtenir le nombre de cœurs utilisés par tous les travaux (processus) soumis par un utilisateur?
Tim
@Tim Pas tout de suite. Je devrais soit écrire un tel script en analysant la topsortie, soit Google pour voir si quelqu'un l'a déjà fait. Cependant, je ne suis pas convaincu que cela en vaille la peine car je pense que j'obtiendrai des sorties différentes pour chaque exécution, étant donné la vitesse à laquelle le changement de contexte se produit. Le chargement du système n'est-il pas un indicateur suffisamment bon? Il vous indique efficacement le nombre de cœurs virtuels requis pour gérer la file d'attente de processus (processus en attente sur le processeur).
nagul
@ nagul: Oui, la charge du système est bonne et je vérifie également cela. Cependant, certaines personnes continuent de me dire que je ne peux pas utiliser tous les cœurs, car qui sait que d'autres exécuteront bientôt leur travail. Je suppose donc que je dois limiter les cœurs que j'utilise. Au fait, avez-vous vu quelque part des scripts en ligne qui vérifient la charge du processeur et de la mémoire et soumettent dynamiquement des travaux en fonction de l'utilisation? Je les regarde depuis si longtemps. Merci!
Tim