Wie viele Kerne verwende ich auf einem Linux-Server?

30

Ich frage mich nur, wie ich in Bash herausfinden kann, wie viele CPU-Kerne ein Benutzer derzeit auf einem Linux-Server verwendet.

Ich übermittle eine ganze Reihe von Hintergrundjobs an den Server. Daher möchte ich ein Bash-Skript schreiben, um zu überprüfen, ob die von mir übermittelten laufenden Jobs (Prozesse) zu viele sind, da ich andere Jobs zulassen muss Benutzer haben genug Kerne, um sie für ihre Jobs zu verwenden. Ich möchte wissen, welcher bash-Befehl mir sagen kann, wie viele Kerne meine Jobs jetzt verwenden.

Danke und Grüße!

Tim
quelle

Antworten:

39

So ermitteln Sie die Anzahl der CPU- Kerne pro CPU:

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

Oder um die Anzahl der physischen CPUs zu ermitteln :

grep "^physical id" /proc/cpuinfo | sort -u | wc -l
Alix Axel
quelle
26

Ich weiß nicht, ob es hilft, aber Sie können das mpstatDienstprogramm verwenden, um eine Aufschlüsselung der CPU-Auslastung nach einzelnen Prozessoren (oder Kernen) zu erhalten. Zum Beispiel:

$ 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

In diesem Beispiel können Sie die CPU sehen 0, 1und 6machen mehr Arbeit , als der Rest von ihnen. Manchmal werden Sie feststellen, dass sich eine einzelne CPU in der Nähe von (oder auf) 100% befindet, während sich andere auf Null befinden. Dies kann ein Indikator für ein Programm (oder einen Teil eines Programms) sein, das ein Thread ist und jeweils nur eine CPU verwenden kann.

mpstatVerwenden Sie zur Installation auf einem Fedora-, RHEL- oder CentOS-System yum install sysstat.

Matt Solnit
quelle
Vielen Dank für diese Antwort! Meine Kollegen haben den Befehl "top" verwendet und alle falschen Schlussfolgerungen zur Prozessorauslastung gezogen, bis ich ihnen den Befehl mpstat zeigte.
Nav
Nicht verfügbar auf Ubuntu: # aptitude search mpstat #.
Alix Axel
2
@AlixAxel versuchen Sie aptitude search systatstattdessen.
Matt Solnit
@MattSolnit: Immer noch kein Glück.
Alix Axel
mpstat wird im Paket sysstat unter Debian und Ubuntu bereitgestellt . Ich würde erwarten, dass die meisten von Debian abgeleiteten Distributionen denselben Paketnamen verwenden. Beginnen Sie bei von Debian abgeleiteten Distributionen mit apt-cache search --full mpstat.
CVn
2

Sofern nicht explizit festgelegt wurde, dass ein Prozess nicht an eine bestimmte CPU gebunden werden soll, kann davon ausgegangen werden, dass alle Kerne jederzeit verwendet werden. Der Scheduler weist den Prozessen den nächsten verfügbaren Kern zu. Beispiel: "System Monitor" (Teil von GNOME) zeigt meine Last auf allen 4 Kernen meines Computers fast gleich an.

EmmEff
quelle
Ich übermittle eine ganze Reihe von Hintergrundjobs an den Server, daher schreibe ich gerne ein Bash-Skript, um zu überprüfen, ob die von mir übermittelten laufenden Jobs (Prozesse) zu viele sind, weil ich sie anderen Benutzern überlassen muss genug Kerne für ihre Arbeit zu verwenden. Ich möchte wissen, welcher bash-Befehl mir sagen kann, wie viele Kerne meine Jobs jetzt verwenden.
Tim
3
Ich glaube nicht, dass Sie meine Antwort verstanden haben. Die Anzahl der verwendeten Kerne ist IMMER die Gesamtzahl der verfügbaren Kerne. Verwenden Sie die Gesamtsystemauslastung als Faktor, um zu bestimmen, ob Ihre Jobübermittlung gedrosselt werden soll oder nicht.
EmmEff
Danke! Ich überprüfe die gesamte Systemlast. Einer meiner Kollegen hat mir gesagt, dass ich nicht alle Kerne verbrauchen kann, denn wer weiß, dass andere ihre Jobs bald ausführen und meine Jobs eine Weile dauern werden. Denken Sie auch, dass ich die verwendeten Kerne begrenzen muss?
Tim
2

Sie werden also sehen, dass es hier Antworten gibt, die Ihnen mitteilen, wie Ihre Kerne genutzt werden.

JEDOCH - das macht dir nicht wirklich etwas aus. Sie haben eine grundlegende Annahme getroffen, die einfach nicht zutrifft - dass Ihre Jobs dazu neigen, sich auf eine Teilmenge der Kerne zu konzentrieren.

Stattdessen werden Ihre Jobs auf alle Kerne verteilt, es sei denn, Sie implementieren etwas, das sie irgendwie "festhält". (Hinweis: Ich empfehle das nicht. Sag nur "Es sei denn".)

Hier ist eine alternative Strategie: Identifizieren Sie für Ihr bestimmtes System die LOAD-Ebene, wenn Sie der Meinung sind, dass es für andere Benutzer "akzeptabel" ist, weitere Jobs hinzuzufügen. Erstellen Sie dann etwas, das nur dann einen neuen Hintergrundjob sendet, wenn die Auslastung unter diesem Grenzwert liegt.

Auf diese Weise wird die Lösung unabhängig von der Anzahl der Kerne, portabler, flexibler und einfacher zu optimieren sein.

pbr
quelle
Mir ist gerade ein Kommentar aufgefallen, den Sie zu der Antwort eines anderen Posters hinzugefügt haben, der darauf hinweist, dass dies auf etwas zurückzuführen ist, das Ihnen ein Kollege gesagt hat. Es scheint also tatsächlich, dass das Missverständnis von ihm stammt und nicht von Ihnen. Das tut mir leid!
1.
Danke! Wenn die aktuelle Auslastung nicht hauptsächlich durch meine ausgeführten Jobs verursacht wird, kann ich die LOAD-Stufe für Ihr bestimmtes System besser verwenden, wenn Sie das Gefühl haben, dass es für andere Benutzer "akzeptabel" ist, weitere Jobs hinzuzufügen die restlichen CPUs, aber wenn meine laufenden Jobs bei der aktuellen Last eine angemessene Menge in Anspruch nehmen, muss ich wahrscheinlich aufgeben, die restlichen CPUs zu verwenden. Denken Sie also immer noch, dass ich die CPU-Auslastung meiner gesamten ausgeführten Jobs nicht abschätzen muss?
Tim
Nein, ich glaube wirklich nicht, dass es sinnvoll ist, zu unterscheiden, wie viel der aktuellen Belastung von Ihren Jobs im Vergleich zu anderen Jobs stammt. Bedenken Sie die Einfachheit: Ihr Job versucht, ein guter Bürger zu sein, und gibt sich nur dann von selbst ab, wenn die Belastung unter einem Niveau liegt, das Sie für akzeptabel halten. Die Idee ist, NIEMALS die gesamte verbleibende Kapazität zu nutzen. das lässt andere zukünftige Benutzer in einer Bindung. Im Idealfall würden alle Benutzer hierfür dieselbe Logik verwenden.
2.
2

Wenn Sie dies tun möchten, damit es unter Linux und OS X funktioniert, können Sie Folgendes tun:

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

Sie können eine ungefähre Schätzung erhalten top, indem Sie " U" ausführen, Ihren Benutzernamen eingeben und dann die CPU-Auslastung Ihrer wichtigsten Prozesse addieren.

dmckee
quelle
Ich möchte einen Bash-Befehl kennen, der mir die Nummer sagt, da ich ihn in einem Bash-Skript verwenden möchte.
Tim
@Tim topkann mit dem Schalter -b im Stapelbetrieb ausgeführt werden. Kombinieren Sie es mit der Option -n, um die Anzahl der Iterationen zu erhalten, die Sie benötigen.
Nagul
1
Können Sie ein Codebeispiel angeben, um die Anzahl der Kerne zu ermitteln, die von allen Jobs (Prozessen) verwendet werden, die von einem Benutzer übergeben wurden?
Tim
@ Tim Nicht von der Stange. Entweder müsste ich ein solches Skript schreiben, indem ich die topAusgabe analysiere, oder Google, um zu sehen, ob jemand es bereits getan hat. Ich bin jedoch nicht davon überzeugt, dass sich die Mühe lohnt, da ich denke, dass ich aufgrund der Geschwindigkeit, mit der die Kontextumschaltung erfolgt, für jeden Lauf unterschiedliche Ausgaben erhalte. Ist die Systemlast nicht ein ausreichend guter Indikator? Es zeigt effektiv an, wie viele virtuelle Kerne für die Verarbeitung der Prozesswarteschlange erforderlich sind (Prozesse, die auf die CPU warten).
Nagul
@nagul: Ja die Systemlast ist gut und ich überprüfe das auch. Einige Leute sagen mir jedoch immer wieder, dass ich nicht alle Kerne aufbrauchen kann, denn wer weiß, dass andere bald ihre Arbeit erledigen werden. Also muss ich die verwendeten Kerne einschränken. Übrigens, haben Sie irgendwo Online-Skripte gesehen, die die CPU- und Speicherauslastung überprüfen und Jobs basierend auf der Nutzung dynamisch übermitteln? Ich habe sie so lange gesucht. Vielen Dank!
Tim