Wie kann man sehen, wie viele Kontextwechsel ein Prozess vornimmt?

25

Ich möchte sehen, ob mein Prozess viele Kontextwechsel vornimmt. Ich möchte auch sehen, wie sich das Manipulieren von Aufgabengruppen auf die Anzahl der Kontextwechsel auswirkt.

Luntain
quelle
Welches Betriebssystem? Welche Version? Welcher Kernel?
Mikel
GNU / Linux 2.6.18
spätestens
5
Check/proc/[pid]/status
Kevin

Antworten:

30

Sie können Informationen zu den Kontextschaltern Ihres Prozesses in anzeigen /proc/<pid>/status.

$ pid=307
$ grep ctxt /proc/$pid/status
voluntary_ctxt_switches:        41
nonvoluntary_ctxt_switches:     16

Führen Sie den Befehl aus, um zu sehen, dass diese Nummern ständig aktualisiert werden

$ # Update twice a second.
$ watch -n.5 grep ctxt /proc/$pid/status

Führen Sie aus, um nur die Zahlen zu erhalten

$ grep ctxt /proc/$pid/status | awk '{ print $2 }'

quelle
Ich habe den obigen Watch-Befehl ausprobiert, aber die Ausgabe ist nur 1 (für einen freiwilligen und unfreiwilligen Kontextwechsel). Meine Linux-Kernversion ist 2.6.39-400.214.4.el6uek.x86_64. Ist die Ausgabe von der Linux-Version abhängig?
Andy Dufresne
Fügen Sie bitte Ihre Ausgabe hier ein.
Es ist das gleiche wie in der Antwort erwähnt - "watch -n.5 grep ctxt / proc / 5647 / status"
Andy Dufresne
Ich muss procfs verwenden, aber auf alten Kerneln gibt es keine Werte in /proc/.../status. irgendein Vorschlag ?
Massimo
12

pidstat (1) - Berichtsstatistik für Linux-Tasks. Laut ist man pidstates so einfach wie ebenpidstat -w …

Poige
quelle
Ich habe den Befehl "watch -n0.5 pidstat -w -I -p 5876" ausgeführt, aber die Ausgabe ist 0 (für beide cswch / s nvcswch / s). Funktioniert dieser Befehl für die Linux-Version 2.6.39-400.214.4.el6uek.x86_64?
Andy Dufresne
Dieser Befehl sollte einwandfrei funktionieren. Aber passen Sie es falsch verwenden , weil , wenn Sie Berichtsintervall nicht angeben „Aufgaben Statistiken sind für die Zeit gemeldet werden , da Systemstart (Booten).“ Ähnlich wie vmstat, iostatund andere. Wenn also aktuelle Statistiken benötigt werden, anstatt watchsie auszuführen, führen Sie sie einfach mit einem Sekundenintervall aus.
Poige
Wie kann ich sehen, dass die Zahlen ständig aktualisiert werden, wenn ich nicht zuschaue? Wenn Sie den Befehl "pidstat -w -I -p 5876 5" ausführen, wartet der Befehl nur 5 Sekunden und gibt dann die Ausgabe aus (erneut als 0). Es läuft nicht wie erwartet kontinuierlich (ich weiß, dass dies im Widerspruch zu der Manpage von pidstat steht - linux.die.net/man/1/pidstat ). Mein Betriebssystem ist Oracle Linux Server 6.4.
Andy Dufresne
Funktioniert `pidstat -w -l -p SELF 1` für Sie?
Poige
4

Um eine Aufzeichnung eines gesamten Prozessablaufs zu erhalten, können Sie das GNU- timeDienstprogramm (verwechseln Sie es nicht mit dem basheingebauten) mit der -vOption verwenden. Hier ist ein Beispiel, bei dem nicht verwandte Ausgabezeilen entfernt wurden:

$ `which time` -v ls
a.out  exception_finder.cpp  log.txt
    Command being timed: "ls"
               ...
    Voluntary context switches: 1
    Involuntary context switches: 2
               ...
    Exit status: 0
rsaxvc
quelle
3

Sie können verwenden sar -w,. Beispiel: sar -w 1 3Gibt die Gesamtzahl der Kontextwechsel pro Sekunde für jeweils 1 Sekunde insgesamt dreimal an.

Karen
quelle
1
Das funktioniert auf vielen Systemen nicht "out of the box", auch wenn der Befehl verfügbar ist. Können Sie in Ihrer Antwort angeben, wie die Datenerfassung für aktiviert werden soll sar?
Anthon
2

Schreiben Sie das folgende Skript in file ( ctx.sh). Mit sehen ctx.sh <core>Sie alle Prozesse, die auf einem bestimmten Kern ausgeführt werden, und wechselnde NV-Kontext-Schalter werden hervorgehoben. Wenn Sie dies betrachten, werden Sie in der Lage sein, die konkurrierenden Prozesse für den Kern zu identifizieren.

#!/bin/bash

if [[ $# -eq 0 ]]
then
   echo "Usage:"
   echo "$0 <core>"
   exit 1
fi

if [[ -z $2 ]]
then
   watch -d -n .2 $0 $1 nw
fi

ps -Leo lastcpu:1,tid,comm | grep "^$1 " | awk '{printf $3": ";system("cut -d\" \" -f3  /proc/"$2"/task/"$2"/schedstat 2>/dev/null")}' | sort -k 1 | column -t
Mahendra
quelle
1

Sehen Sie sich man getrusage an, mit dem Sie die Anzahl der freiwilligen und unfreiwilligen Kontextwechsel abfragen können.

struct rusage {
           struct timeval ru_utime; /* user CPU time used */
           struct timeval ru_stime; /* system CPU time used */
           long   ru_maxrss;        /* maximum resident set size */
           long   ru_ixrss;         /* integral shared memory size */
           long   ru_idrss;         /* integral unshared data size */
           long   ru_isrss;         /* integral unshared stack size */
           long   ru_minflt;        /* page reclaims (soft page faults) */
           long   ru_majflt;        /* page faults (hard page faults) */
           long   ru_nswap;         /* swaps */
           long   ru_inblock;       /* block input operations */
           long   ru_oublock;       /* block output operations */
           long   ru_msgsnd;        /* IPC messages sent */
           long   ru_msgrcv;        /* IPC messages received */
           long   ru_nsignals;      /* signals received */
           long   ru_nvcsw;         /* voluntary context switches */
           long   ru_nivcsw;        /* involuntary context switches */
};

Sie können festlegen, dass Informationen pro Thread wie folgt gemeldet werden sollen:

struct rusage usage;
getrusage( RUSAGE_THREAD, &usage );

Rufen Sie es einfach zweimal vor und nach Ihrem kritischen Abschnitt auf und prüfen Sie, ob der usage.ru_nivcsw-Wert gestiegen ist oder nicht.

Bram
quelle
0
sudo perf stat -e context-switches -I 1000 PROCESS_NAME
Nadav B
quelle