Bestimmen des bestimmten Prozessors, auf dem ein Prozess ausgeführt wird

10

Ich habe Zugriff auf einen 8-Kern-Knoten eines Linux-Clusters. Wenn ich am Knoten angemeldet bin, kann ich mit diesem Befehl eine Liste der Prozessoren anzeigen:

more /proc/cpuinfo

In meinem 8-Kern-Knoten sind die Prozessoren von 0 bis 7 nummeriert. Jeder Prozessor ist eine Intel Xeon-CPU (E5430 bei 2,66 GHz).

Angenommen, ich rufe das Programm foomit einigen Argumenten auf args:

foo args

Die fooAusführung des Programms dauert lange (z. B. Stunden oder Tage). Ist es nach dem Aufruf foomöglich, den bestimmten Prozessor (dh 0 bis 7) zu bestimmen , auf dem ausgeführt foowird? Das topProgramm zeigt mir die Prozess - ID und ähnliche Informationen, aber ich sehe den Prozessor nicht Nummer . Sind solche Informationen verfügbar?

Andrew
quelle
1
Wenn Sie nichts Bestimmtes getan haben, bleibt der Prozess nicht immer auf derselben CPU. Warum brauchst du diese Informationen?
Mat
@ Mat Danke für deine Zeit. Dies ist eine separate Frage, aber letztendlich möchte ich sehen, ob ich zwei Aufrufen foozwei verschiedenen Prozessoren zuweisen kann . Wenn ich fooeinmal anrufe, läuft es mit %CPUfast 100% (laut top). Wenn ich jedoch fooein zweites Mal aufrufe, werden beide fooProzesse so ausgeführt, dass sich die Werte %CPUfür beide Prozesse auf weniger als 100% summieren (normalerweise etwa 45% für jeden fooProzess). Für mich bedeutet dies, dass die beiden Aufrufe fooauf demselben Prozessor ausgeführt werden (obwohl acht Prozessoren verfügbar sind). Ich möchte überprüfen, ob dies der Fall ist.
Andrew
1
Der Begriff heißt Prozessoraffinität
slm
1
Mit dem Scheduler können Dinge auf mehreren (verschiedenen) Prozessoren ausgeführt werden. Ihr Programm muss jedoch als Multithread-Programm erstellt werden, um die gleichzeitige Mehrfachverarbeitung für ein bestimmtes Programm oder eine bestimmte Aufgabe nutzen zu können. Je nachdem, wer die Anwendung programmiert, versuchen Java-Programme dies zu tun.
mdpc

Antworten:

11

psSie können diese Informationen erhalten, wenn Sie nach der psrSpalte fragen (oder das -FFlag verwenden, das sie enthält).

Ex:

$ ps -F $$
UID        PID  PPID  C    SZ   RSS PSR STIME TTY      STAT   TIME CMD
me        6415  6413  0  5210  2624   2 18:52 pts/0    SN     0:00 -su

Oder:

$ ps -o pid,psr,comm -p $$
  PID PSR COMMAND
 6415   0 bash

Meine Shell lief auf CPU 2, als ich den ersten Befehl ausführte, auf CPU 0, als ich den zweiten ausführte. Beachten Sie, dass Prozesse die CPUs sehr, sehr schnell ändern können, sodass die tatsächlich angezeigten Informationen im Wesentlichen bereits veraltet sind.

Weitere Informationen in den Antworten dieser Super User-Frage:

Linux: Befehl, um die Prozessornummer zu kennen, in die ein Prozess geladen wird?

Matte
quelle
4

Mit dem topvon procps( in der Regel des Standard - Linux - Distributionen heutzutage), in topdrücken f, wechseln Sie zu P = Last User CPU (SMP)und drücken Sie Spacedie Option (Sie können auch das Feld zum Beispiel bewegen , bevor das COMMANDFeld mit dem RightSchlüssel und dann nach oben und unten). qum zum Hauptbildschirm zurückzukehren (wo Sie sehen, wie Ihr Prozess von Prozessor zu Prozessor wechselt, es sei denn, Sie haben ihn explizit so konfiguriert, dass er bei einem bleibt). Sie können drücken W, um dies als Standard zu speichern.

Drücken Sie ?für Hilfe.

Stéphane Chazelas
quelle
4

Der Befehl tasksetist das, wonach Sie suchen:

Task-Set - Abrufen oder Festlegen der CPU-Affinität eines Prozesses

Beispiel

$ taskset -p 12345
pid 12345's current affinity mask: f

Eine Maske fbedeutet alle Prozessoren, 0x00000001wäre nur Prozessor 0.

$ taskset -c -p 24389 
pid 24389's current affinity list: 0-3

Zeigt die CPUs im Listenformat an. In diesem Beispiel habe ich 4 Kerne auf meinem Laptop.

Weitere Informationen finden Sie in der Manpage .

slm
quelle
1

Sie können diese Informationen auch direkt von erhalten /proc/[pid]/stat. Es ist das 39. durch Leerzeichen getrennte Feld (seit Linux 2.2.8).

Zum Beispiel, um anzuzeigen, auf welchem ​​CPU-Prozessor die aktuelle Shell ausgeführt wird (in diesem Fall):

cat  /proc/$$/stat | cut -d' ' -f39
drgnfr
quelle