Come vedere quanti switch di contesto fa un processo?


25

Voglio vedere se il mio processo fa molti cambi di contesto. Voglio anche vedere come la manipolazione dei gruppi di attività influisce sul numero di cambi di contesto.


Quale sistema operativo? Quale versione? Quale kernel?
Mikel,

GNU / Linux 2.6.18
luntain

5
Controlla/proc/[pid]/status
Kevin,

Risposte:


30

È possibile visualizzare le informazioni sui cambi di contesto del processo in /proc/<pid>/status.

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

Per vedere questi numeri aggiornarsi continuamente, esegui

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

Per ottenere solo i numeri, esegui

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

Ho provato il comando watch sopra ma l'output è solo 1 (per il cambio di contesto volontario e involontario). La mia versione kernal di Linux è 2.6.39-400.214.4.el6uek.x86_64. L'output dipende dalla versione di Linux?
Andy Dufresne,

Incolla qui l'output per favore.

È lo stesso menzionato in answere - "watch -n.5 grep ctxt / proc / 5647 / status"
Andy Dufresne,

Devo usare procfs ma sui vecchi kernel non ci sono i valori all'interno di /proc/.../status. qualche suggerimento ?
Massimo

12

pidstat (1) - Segnala statistiche per attività Linux. Secondo man pidstatè così facile come solopidstat -w …


Ho eseguito il comando "watch -n0.5 pidstat -w -I -p 5876" ma l'output è 0 (per entrambi cswch / s nvcswch / s). Questo comando funziona per la versione linux - 2.6.39-400.214.4.el6uek.x86_64?
Andy Dufresne,

Questo comando dovrebbe funzionare bene. Ma attenzione, lo stai usando in modo errato perché quando non specifichi l'intervallo di rapporto "le statistiche delle attività devono essere riportate per il momento dall'avvio del sistema (avvio)" simile a vmstat, iostate altri. Quindi, se sono necessarie statistiche attuali invece di watcheseguirle semplicemente con un intervallo di un secondo.
poige

Se non guardo, come vedo i numeri aggiornarsi continuamente? Eseguendo il comando "pidstat -w -I -p 5876 5" il comando attende solo 5 secondi e quindi stampa l'output (di nuovo come 0). Non funziona continuamente come mi aspettavo (so che questo è in contraddizione con quanto dice la pagina man di pidstat - linux.die.net/man/1/pidstat ). Il mio sistema operativo è Oracle Linux Server 6.4.
Andy Dufresne,

`Pidstat -w -l -p SELF 1` funziona per te?
poige,

4

Per ottenere una registrazione di un intero processo eseguito, è possibile utilizzare l' timeutilità GNU (non confonderla con l' bashintegrato) con l' -vopzione. Ecco un esempio con le righe non correlate di output rimosse:

$ `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

3

Puoi usare sar -w,. Ad esempio, sar -w 1 3riporta il numero totale di cambi di contesto al secondo per ogni 1 secondo per un totale di 3 volte.


1
Ciò non funziona "out of the box" su molti sistemi, anche se il comando è disponibile. Puoi includere nella tua risposta come abilitare la raccolta dati per sar?
Anthon,

2

Scrivi il seguente script su file ( ctx.sh). con ctx.sh <core>te vedrai tutti i processi in esecuzione su un dato core e verranno evidenziate le modifiche al cambio di contesto nv. Guardando questo, sarai in grado di identificare quali sono i processi in competizione per il core.

#!/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

1

Vedi man getrusage che ti permetterà di interrogare il numero di cambi di contesto volontari e involontari.

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

Puoi dirlo per segnalare informazioni per thread, in questo modo:

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

Basta chiamarlo due volte, prima e dopo la sezione critica, e vedere se il valore use.ru_nivcsw è aumentato o meno.


0
sudo perf stat -e context-switches -I 1000 PROCESS_NAME
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.