Jak sprawdzić, ile przełączników kontekstu dokonuje proces?

25

Chcę sprawdzić, czy mój proces dokonuje wielu przełączeń kontekstu. Chcę również zobaczyć, jak manipulowanie grupami zadań wpływa na liczbę przełączników kontekstu.

luntain
źródło
Jaki system operacyjny Jaka wersja Jakie jądro?
Mikel
GNU / Linux 2.6.18
luntain
5
Sprawdź/proc/[pid]/status
Kevin,

Odpowiedzi:

30

Możesz wyświetlić informacje o przełącznikach kontekstu procesu /proc/<pid>/status.

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

Aby zobaczyć ciągłe aktualizowanie tych liczb, uruchom

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

Aby uzyskać tylko liczby, uruchom

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

źródło
Próbowałem powyższego polecenia watch, ale wynik to tylko 1 (dla dobrowolnego i mimowolnego przełączania kontekstu). Moja wersja jądra Linuksa to 2.6.39-400.214.4.el6uek.x86_64. Czy wyjście zależy od wersji Linux?
Andy Dufresne,
Proszę wklej tutaj swój wynik.
Jest taki sam, jak wspomniany w odpowiedzi - „watch -n.5 grep ctxt / proc / 5647 / status”
Andy Dufresne
Muszę używać procfs, ale na starych jądrach nie ma wartości w /proc/.../status. jakieś sugestie ?
Massimo
12

pidstat (1) - Raportuj statystyki dla zadań Linux. Według man pidstattego jest tak proste jak tylkopidstat -w …

poige
źródło
Wykonałem polecenie „watch -n0.5 pidstat -w -I -p 5876”, ale wynikiem jest 0 (dla obu cswch / s nvcswch / s). Czy to polecenie działa dla wersji linux - 2.6.39-400.214.4.el6uek.x86_64?
Andy Dufresne,
To polecenie powinno działać dobrze. Ale uwaga używasz go źle, bo jeśli nie określić interwał raportu „zadania statystyczne są przekazywane w czasie od startu systemu (boot).” Podobny do vmstat, iostati innych. Więc jeśli potrzebne są aktualne statystyki zamiast watchpo prostu uruchom je z jednosekundowym interwałem.
poige
Jeśli nie oglądam, to jak mogę stale aktualizować liczby? Wykonanie polecenia „pidstat -w -I -p 5876 5” polecenie czeka tylko 5 sekund, a następnie wypisuje dane wyjściowe (ponownie jako 0). Nie działa tak, jak się spodziewałem (wiem, że jest to sprzeczne z tym, co mówi strona podręcznika pidstat - linux.die.net/man/1/pidstat ). Mój system operacyjny to Oracle Linux Server 6.4.
Andy Dufresne
Czy `pidstat -w -l -p SELF 1` działa dla Ciebie?
poige
4

Aby uzyskać zapis całego przebiegu procesu, możesz użyć timenarzędzia GNU (nie mylić go z bashwbudowanym) z -vopcją. Oto przykład z usuniętymi niepowiązanymi wierszami danych wyjściowych:

$ `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
źródło
3

Możesz użyć sar -w,. Na przykład sar -w 1 3raportuje całkowitą liczbę przełączeń kontekstu na sekundę co 1 sekundę łącznie 3 razy.

Karen
źródło
1
To nie działa „po wyjęciu z pudełka” w wielu systemach, nawet jeśli polecenie jest dostępne. Czy możesz podać w swojej odpowiedzi, jak włączyć gromadzenie danych sar?
Anthon
2

Napisz następujący skrypt do file ( ctx.sh). z ctx.sh <core>zobaczysz wszystkie procesy uruchomione na danym rdzeniu i zmienia przełączniki nv-context zostaną podświetlone. Patrząc na to, będziesz w stanie określić, które są konkurującymi procesami dla rdzenia.

#!/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
źródło
1

Zobacz man getrusage, który pozwoli ci zapytać o liczbę dobrowolnych i mimowolnych zmian kontekstu.

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 */
};

Możesz powiedzieć mu, aby zgłaszał informacje dotyczące wątków, na przykład:

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

Po prostu wywołaj go dwa razy, przed sekcją krytyczną i po niej, i sprawdź, czy wartość use.ru_nivcsw wzrosła, czy nie.

Bram
źródło
0
sudo perf stat -e context-switches -I 1000 PROCESS_NAME
Nadav B.
źródło