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 uptime
montre une petite charge: load average: 0.01, 0.02, 0.01
et top
ne 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 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 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?
Réponses:
Eh bien, un cas assez intéressant. Essayez d'observer
watch -tdn1 cat /proc/interrupts
. Voyez-vous là des changements importants?la source
Essayez d'utiliser
L'option 't' affiche également les threads. Il peut s'agir d'un thread qui effectue les changements de contexte.
la source
Dans une version plus récente du noyau
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)
la source
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.
la source
powertop
peut vous dire à quelle fréquence un processus réveille le CPU.la source