Finden Sie heraus, welche Aufgabe unter Linux viele Kontextwechsel generiert

11

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

... uptimezeigt aber geringe Last: load average: 0.01, 0.02, 0.01und topzeigt keinen Prozess mit hoher% CPU-Auslastung.

Wie finde ich heraus, was genau diese Kontextwechsel generiert? Welcher Prozess / Thread?

Ich habe versucht, die pidstatAusgabe 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?

grzaks
quelle
Die Sache mit Postgre ist, dass sie unterschiedliche PID sind, also völlig unterschiedliche Programme.
Gopoi
1
Für einen Prozess: unix.stackexchange.com/questions/39342/…
Ciro Santilli 4 改造 中心 法轮功 六四

Antworten:

5

Nun, ein ziemlich interessanter Fall. Versuchen Sie zu beobachten watch -tdn1 cat /proc/interrupts. Sehen Sie dort wertvolle Veränderungen?

poige
quelle
"Lokale Timer-Interrupts" erzeugen einige hundert (200-800) Interrupts auf jedem CPU-Kern. Was könnte das bedeuten? Auch eth0-rx / tx erzeugen einige Interrupts aufgrund des Datenverkehrs auf diesem Server, aber das ist nicht viel.
Grzaks
Wie wäre es mit "Funktionsaufruf-Interrupts"?
Poige
10

Versuchen Sie es mit

pidstat -wt

Die Option 't' zeigt auch die Threads an. Es könnte ein Thread sein, der die Kontextwechsel durchführt.

Deutscher Garcia
quelle
1
Ausführen von pidstat -wt | sort -n -k4 ist besser.
Ismael Vacco
2

In neuerer Kernel-Version

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

# then ctrl+c

sudo perf report # inspect the result

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).

sudo perf record -e context-switches -a -g
snyh
quelle
1

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.

Gopoi
quelle
1
Gut. Ich weiß, was ein Kontextwechsel ist und welche Auswirkungen er auf die Systemleistung hat. Ich brauche nur eine Möglichkeit zu messen, wie viele Kontextwechsel zu welchen Prozessen unter Linux durchgeführt werden. Ich habe bereits rohe CSW-Zähler in / proc / * / stats (freiwillige_ctxt_switches) gefunden
grzaks
0

powertop kann Ihnen sagen, wie oft ein Prozess die CPU aufweckt.

Hubert Kario
quelle