Selon VMSTAT, mon serveur Linux (2xcore2 duo 2,5 GHz) fait constamment environ 20 000 commutateurs 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 uptime
montre une petite charge: load average: 0.01, 0.02, 0.01
et top
ne montre aucun processus avec une utilisation élevée de la CPU.
Comment puis-je savoir ce que génère exactement ces commutateurs de contexte? Quel processus/thread?
J'ai essayé d'analyser pidstat
sortie:
# 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 maquilles de contexte par seconde, mais cela ne résume pas tous à 20k de toute façon.
Avez-vous une idée de creuser un peu plus profondément pour une réponse?
Eh bien, cas assez intéressant. Essayez d'observer watch -tdn1 cat /proc/interrupts
. Voyez-vous des changements précieux là-bas?
Essayer d'utiliser
pidstat -wt
L'option 'T' montre également les threads. Cela pourrait être un fil qui fait les commutateurs de contexte.
Dans la nouvelle version du noyau
Sudo perf record -e context-switches -a # record the events
# then ctrl+c
Sudo perf report # inspect the result
Cela vous donnera exactement le résultat sur les événements de commutateurs contextuels.
Et vous trouverez peut-être la raison pour laquelle les indicateurs de "-g" de contexte ont provoqué les indicateurs de "-g" (le résultat lisible déterminé par des informations symboliques)
Sudo perf record -e context-switches -a -g
Le commutateur de contexte est normal. Un processus est attribué à une quantité de temps, s'il finit (ou en pause en pause causée par la nécessité de ressources) ce qu'il faut le faire peut laisser le processeur aller.
Cela dit de compter combien de commutateurs de contexte sont effectués (il devient une réponse à Stackoverflow.com), il faudrait la commande interne du calendrier du noyau () pour écrire dans les tables de processus. A il n'y a pas une telle chose si vous programmez votre propre noyau, vous serez en mesure de voir, mais il est assez difficile.
powertop
peut vous dire combien de fois qu'un processus se réveille la CPU.