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.
/proc/[pid]/status
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.
/proc/[pid]/status
Antworten:
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 }'
pidstat (1) - Berichtsstatistik für Linux-Tasks. Laut ist man pidstat
es so einfach wie ebenpidstat -w …
vmstat
, iostat
und andere. Wenn also aktuelle Statistiken benötigt werden, anstatt watch
sie auszuführen, führen Sie sie einfach mit einem Sekundenintervall aus.
Um eine Aufzeichnung eines gesamten Prozessablaufs zu erhalten, können Sie das GNU- time
Dienstprogramm (verwechseln Sie es nicht mit dem bash
eingebauten) mit der -v
Option 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
Sie können verwenden sar -w
,. Beispiel: sar -w 1 3
Gibt die Gesamtzahl der Kontextwechsel pro Sekunde für jeweils 1 Sekunde insgesamt dreimal an.
sar
?
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
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.