Scopri quale attività sta generando molti switch di contesto su Linux


11

Secondo vmstat, il mio server Linux (2xCore2 Duo 2,5 GHz) esegue costantemente circa 20k switch di contesto al secondo.

# vmstat 3
procs -----------memory----------  ---swap-- -----io----  -system-- ----cpu----
 r  b   swpd   free   buff  cache    si   so    bi    bo   in    cs us sy id wa
 2  0   7292 249472  82340 2291972    0    0     0     0    0     0  7 13 79  0
 0  0   7292 251808  82344 2291968    0    0     0   184   24 20090  1  1 99  0
 0  0   7292 251876  82344 2291968    0    0     0    83   17 20157  1  0 99  0
 0  0   7292 251876  82344 2291968    0    0     0    73   12 20116  1  0 99  0

... ma uptimemostra un carico ridotto: load average: 0.01, 0.02, 0.01e topnon mostra alcun processo con un elevato utilizzo della CPU.

Come faccio a sapere cosa sta generando esattamente questi switch di contesto? Quale processo / thread?

Ho provato ad analizzare l' pidstatoutput:

# pidstat -w 10 1

12:39:13          PID   cswch/s nvcswch/s  Command
12:39:23            1      0.20      0.00  init
12:39:23            4      0.20      0.00  ksoftirqd/0
12:39:23            7      1.60      0.00  events/0
12:39:23            8      1.50      0.00  events/1
12:39:23           89      0.50      0.00  kblockd/0
12:39:23           90      0.30      0.00  kblockd/1
12:39:23          995      0.40      0.00  kirqd
12:39:23          997      0.60      0.00  kjournald
12:39:23         1146      0.20      0.00  svscan
12:39:23         2162      5.00      0.00  kjournald
12:39:23         2526      0.20      2.00  postgres
12:39:23         2530      1.00      0.30  postgres
12:39:23         2534      5.00      3.20  postgres
12:39:23         2536      1.40      1.70  postgres
12:39:23        12061     10.59      0.90  postgres
12:39:23        14442      1.50      2.20  postgres
12:39:23        15416      0.20      0.00  monitor
12:39:23        17289      0.10      0.00  syslogd
12:39:23        21776      0.40      0.30  postgres
12:39:23        23638      0.10      0.00  screen
12:39:23        25153      1.00      0.00  sshd
12:39:23        25185     86.61      0.00  daemon1
12:39:23        25190     12.19     35.86  postgres
12:39:23        25295      2.00      0.00  screen
12:39:23        25743      9.99      0.00  daemon2
12:39:23        25747      1.10      3.00  postgres
12:39:23        26968      5.09      0.80  postgres
12:39:23        26969      5.00      0.00  postgres
12:39:23        26970      1.10      0.20  postgres
12:39:23        26971     17.98      1.80  postgres
12:39:23        27607      0.90      0.40  postgres
12:39:23        29338      4.30      0.00  screen
12:39:23        31247      4.10     23.58  postgres
12:39:23        31249     82.92     34.77  postgres
12:39:23        31484      0.20      0.00  pdflush
12:39:23        32097      0.10      0.00  pidstat

Sembra che alcune attività di postgresql stiano eseguendo> 10 scambi di contesto al secondo, ma non si sommano tutti fino a 20k.

Qualche idea su come scavare un po 'più a fondo per una risposta?


La cosa su Postgre è che sono programmi diversi, quindi completamente diversi.
Gopoi,

Risposte:


5

Bene, caso abbastanza interessante. Prova ad osservare watch -tdn1 cat /proc/interrupts. Vedi qualche cambiamento prezioso lì?


"Interruzioni del timer locale" sta generando poche centinaia (200-800) interruzioni su ciascun core della CPU. Cosa potrebbe significare? Anche eth0-rx / tx stanno generando alcuni interrupt a causa del traffico su quel server, ma non molto.
grzaks,

Che ne dici di "Interrupt di chiamata funzione"?
poige,

10

Prova a usare

pidstat -wt

L'opzione 't' mostra anche i thread. Potrebbe essere un thread che sta eseguendo i cambi di contesto.


1
in esecuzione pidstat -wt | ordina -n -k4 è meglio.
Ismael Vacco,

2

Nella versione del kernel più recente

sudo perf record -e context-switches -a  # record the events

# then ctrl+c

sudo perf report # inspect the result

Questo ti darà il risultato esatto sugli eventi di cambio di contesto.

E potresti trovare il motivo che ha causato i cambi di contesto aggiungendo i flag "-g" (Il risultato leggibile determinato dalle informazioni sul simbolo)

sudo perf record -e context-switches -a -g

1

Il cambio di contesto è normale. Un processo è assegnato a una quantità di tempo, se termina (o è in pausa a causa della necessità di risorse) ciò che deve fare può lasciare andare il processore.

Detto questo per contare quanti switch di contesto sono stati fatti (diventa una risposta stackoverflow.com) ci vorrebbe il comando interno del kernel () per scrivere nelle tabelle dei processi. A non esiste una cosa del genere se si programma il proprio kernel che si sarà in grado di vedere ma è abbastanza difficile.


1
Bene. So cos'è il cambio di contesto e quali implicazioni ha per le prestazioni del sistema. Ho solo bisogno di un modo per misurare quanti switch di contesto vengono eseguiti su quali processi su Linux. Ho già trovato i contatori csw grezzi in / proc / * / stats (voluntary_ctxt_switches)
grzaks

0

powertop può dirti con quale frequenza un processo sta riattivando la CPU.

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.