Découvrez quelle tâche génère beaucoup de changements de contexte sur Linux

11

Selon vmstat, mon serveur Linux (2xCore2 Duo 2,5 GHz) effectue constamment environ 20 000 changements de contexte par seconde.

# 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

... mais uptimemontre une petite charge: load average: 0.01, 0.02, 0.01et topne montre aucun processus avec un pourcentage élevé d'utilisation du CPU.

Comment savoir exactement ce qui génère ces commutateurs de contexte? Quel processus / fil?

J'ai essayé d'analyser la pidstatsortie:

# 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

On dirait que certaines tâches postgresql font> 10 commutations de contexte par seconde, mais cela ne résume pas tout de même à 20k de toute façon.

Une idée comment creuser un peu plus profondément pour une réponse?

grzaks
la source
La chose à propos de postgre est qu'ils sont différents, donc des programmes complètement différents.
Gopoi
1
gor one process: unix.stackexchange.com/questions/39342/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Réponses:

5

Eh bien, un cas assez intéressant. Essayez d'observer watch -tdn1 cat /proc/interrupts. Voyez-vous là des changements importants?

poige
la source
Les «interruptions du minuteur local» génèrent quelques centaines (200-800) interruptions sur chaque cœur de CPU. Qu'est-ce que cela pourrait signifier? Eth0-rx / tx génèrent également des interruptions à cause du trafic sur ce serveur, mais pas beaucoup.
grzaks
Que diriez-vous des "interruptions d'appel de fonction"?
poige
10

Essayez d'utiliser

pidstat -wt

L'option 't' affiche également les threads. Il peut s'agir d'un thread qui effectue les changements de contexte.

Garcia allemand
la source
1
exécution de pidstat -wt | sort -n -k4 est meilleur.
Ismael Vacco
2

Dans une version plus récente du noyau

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

# then ctrl+c

sudo perf report # inspect the result

Cela vous donnera le résultat exact des événements de changement de contexte.

Et vous pouvez trouver la raison pour laquelle les changements de contexte ont été ajoutés par les drapeaux "-g" (le résultat lisible déterminé par les informations de symbole)

sudo perf record -e context-switches -a -g
snyh
la source
1

Le changement de contexte est normal. Un processus est assigné à un quanta de temps, s'il termine (ou s'il s'arrête à cause du besoin de ressources) ce qu'il doit faire, il peut laisser partir le processeur.

Cela dit, pour compter le nombre de changements de contexte effectués (cela devient une réponse stackoverflow.com), il faudrait la commande interne kernel schedule () pour écrire dans les tables de processus. Il n'y a rien de tel si vous programmez votre propre noyau, vous pourrez le voir, mais c'est assez difficile.

Gopoi
la source
1
Bien. Je connais le changement de contexte et ses implications pour les performances du système. J'ai juste besoin d'un moyen de mesurer combien de changements de contexte sont effectués sur quels processus sous Linux. J'ai déjà trouvé des compteurs csw bruts dans / proc / * / stats (volontaire_ctxt_switches)
grzaks
0

powertop peut vous dire à quelle fréquence un processus réveille le CPU.

Hubert Kario
la source