it-swarm.com.de

Wie kann man sehen, wie viele Kontextwechsel ein Prozess durchführt?

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

28
luntain

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

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

Führen Sie aus, damit diese Nummern kontinuierlich aktualisiert werden

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

Um nur die Zahlen zu erhalten, laufen Sie

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

pidstat (1) - Statistiken für Linux-Aufgaben melden. Gemäß man pidstat es ist so einfach wie nur pidstat -w …

12
poige

Um eine Aufzeichnung eines gesamten Prozesslaufs zu erhalten, können Sie das Dienstprogramm GNU time (verwechseln Sie es nicht mit dem integrierten bash) mit dem -v Möglichkeit. 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
4
rsaxvc

Sie können verwenden, sar -w. Zum Beispiel, sar -w 1 3 gibt die Gesamtzahl der Kontextwechsel pro Sekunde alle 1 Sekunde insgesamt dreimal an.

3
Karen

Schreiben Sie das folgende Skript in die Datei (ctx.sh). mit ctx.sh <core> Sie sehen alle Prozesse, die auf einem bestimmten Kern ausgeführt werden, und das Ändern von nv-Kontext-Schaltern wird hervorgehoben. Wenn Sie dies betrachten, können Sie die konkurrierenden Prozesse für den Kern 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
2
mahendra

Siehe man getrusage, 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 Wert von usage.ru_nivcsw gestiegen ist oder nicht.

2
Bram
Sudo perf stat -e context-switches -I 1000 PROCESS_NAME
0
Nadav B