Dowiedz się, które zadanie generuje wiele przełączników kontekstowych w systemie Linux

11

Według vmstat mój serwer Linux (2xCore2 Duo 2,5 GHz) stale wykonuje około 20 000 przełączników kontekstowych na sekundę.

# 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

... ale uptimepokazuje małe obciążenie: load average: 0.01, 0.02, 0.01i topnie pokazuje żadnego procesu o wysokim% wykorzystania procesora.

Jak dowiedzieć się, co dokładnie generuje te przełączniki kontekstu? Który proces / wątek?

Próbowałem przeanalizować pidstatdane wyjściowe:

# 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

Wygląda na to, że niektóre zadania postgresql wykonują> 10 ruchów kontekstowych na sekundę, ale i tak nie sumują się do 20 000.

Masz pomysł, jak kopać trochę głębiej, aby uzyskać odpowiedź?

grzaks
źródło
Rzecz w postgre polega na tym, że są one różnymi pid, a więc zupełnie różnymi programami.
Gopoi
1
gor one process: unix.stackexchange.com/questions/39342/...
Ciro Santilli 4 病毒 审查 六四 事件 法轮功

Odpowiedzi:

5

Cóż, całkiem ciekawa sprawa. Spróbuj obserwować watch -tdn1 cat /proc/interrupts. Czy widzisz tam jakieś cenne zmiany?

poige
źródło
„Lokalne przerwania timera” generują kilkaset (200–800) przerwań na każdym rdzeniu procesora. Co to może znaczyć? Również eth0-rx / tx generują pewne przerwania z powodu ruchu na tym serwerze, ale to niewiele.
grzaks 11.04.11
A co z „przerwaniami wywołania funkcji”?
poige 11.04.11
10

Spróbuj użyć

pidstat -wt

Opcja „t” pokazuje również wątki. Może to być wątek, który wykonuje zmiany kontekstu.

Niemiecki Garcia
źródło
1
uruchamianie pidstat -wt | sort -n -k4 jest lepszy.
Ismael Vacco,
2

W nowszej wersji jądra

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

# then ctrl+c

sudo perf report # inspect the result

To da dokładnie wynik dotyczący zdarzeń przełączania kontekstu.

Być może przyczyną jest przełączenie kontekstu przez dodanie flag „-g” (wynik możliwy do odczytania na podstawie informacji o symbolu)

sudo perf record -e context-switches -a -g
snyh
źródło
1

Przełączanie kontekstu jest normalne. Proces jest przypisany do kwanty czasu, jeśli zostanie zakończony (lub zatrzymany z powodu potrzeby zasobów), to co musi zrobić, może pozwolić procesorowi odejść.

To powiedziawszy, aby policzyć, ile przełączników kontekstu zostało wykonanych (staje się to odpowiedziami stackoverflow.com), zajmie to polecenie wewnętrznego jądra harmonogramu (), aby zapisać w tabelach procesów. Nie ma takiej rzeczy, jeśli zaprogramujesz własne jądro, które zobaczysz, ale jest to dość trudne.

Gopoi
źródło
1
Dobrze. Wiem, co to jest zmiana kontekstu i jakie to ma wpływ na wydajność systemu. Potrzebuję tylko sposobu, aby zmierzyć, ile przełączników kontekstu jest wykonanych dla których procesów w systemie Linux. Znalazłem już surowe liczniki csw w / proc / * / stats (dobrowolne_ctxt_switches)
grzaks 13.10.10
0

powertop może powiedzieć, jak często proces budzi procesor.

Hubert Kario
źródło