Laut vmstat führt mein Linux-Server (2xCore2 Duo 2,5 GHz) ständig etwa 20.000 Kontextwechsel pro Sekunde durch.
# 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
... uptime
zeigt aber geringe Last: load average: 0.01, 0.02, 0.01
und top
zeigt keinen Prozess mit hoher% CPU-Auslastung.
Wie finde ich heraus, was genau diese Kontextwechsel generiert? Welcher Prozess / Thread?
Ich habe versucht, die pidstat
Ausgabe zu analysieren :
# 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
Es sieht so aus, als würden einige Postgresql-Aufgaben> 10 Kontextwechsel pro Sekunde ausführen, aber es summiert sich sowieso nicht alles auf 20.000.
Irgendeine Idee, wie man ein bisschen tiefer nach einer Antwort sucht?
Antworten:
Nun, ein ziemlich interessanter Fall. Versuchen Sie zu beobachten
watch -tdn1 cat /proc/interrupts
. Sehen Sie dort wertvolle Veränderungen?quelle
Versuchen Sie es mit
Die Option 't' zeigt auch die Threads an. Es könnte ein Thread sein, der die Kontextwechsel durchführt.
quelle
In neuerer Kernel-Version
Auf diese Weise erhalten Sie das genaue Ergebnis zu Kontextwechselereignissen.
Und Sie können den Grund finden, der die Kontextwechsel verursacht hat, indem Sie "-g" -Flaggen anhängen (Das lesbare Ergebnis wird durch Symbolinformationen bestimmt).
quelle
Kontextwechsel sind normal. Ein Prozess wird einem Zeitquant zugeordnet. Wenn er beendet ist (oder aufgrund des Bedarfs an Ressourcen angehalten hat), kann er den Prozessor loslassen.
Um zu zählen, wie viele Kontextwechsel durchgeführt werden (es wird zu einer Antwort von stackoverflow.com), würde der interne Kernel-Zeitplan () erforderlich sein, um in die Prozesstabellen zu schreiben. A Es gibt so etwas nicht, wenn Sie Ihren eigenen Kernel programmieren, den Sie sehen können, aber es ist ziemlich schwierig.
quelle
powertop
kann Ihnen sagen, wie oft ein Prozess die CPU aufweckt.quelle