Cari tahu tugas mana yang menghasilkan banyak sakelar konteks di linux


11

Menurut vmstat, server Linux saya (2xCore2 Duo 2.5 GHz) terus melakukan sekitar 20k konteks switch per detik.

# 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

... tetapi uptimemenunjukkan beban kecil: load average: 0.01, 0.02, 0.01dan toptidak menunjukkan proses apa pun dengan penggunaan CPU% tinggi.

Bagaimana cara mengetahui apa yang sebenarnya menghasilkan switch konteks itu? Proses / utas yang mana?

Saya mencoba menganalisis pidstatkeluaran:

# 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

Sepertinya beberapa tugas postgresql melakukan> 10 konteks swiches per detik, tetapi tidak semuanya berjumlah hingga 20rb.

Adakah yang tahu cara menggali lebih dalam untuk jawaban?


Hal tentang postgre adalah bahwa mereka adalah pid yang berbeda sehingga program yang sama sekali berbeda.
Gopoi

Jawaban:


5

Nah, kasus yang cukup menarik. Coba amati watch -tdn1 cat /proc/interrupts. Apakah Anda melihat perubahan yang berharga di sana?


"Local timer interrupt" menghasilkan beberapa ratus (200-800) interupsi pada setiap inti CPU. Apa artinya itu? Juga eth0-rx / tx menghasilkan beberapa interupsi karena lalu lintas di server itu, tetapi itu tidak banyak.
grzaks

Bagaimana dengan "Function call interrupt"?
poige

10

Coba gunakan

pidstat -wt

Opsi 't' juga menampilkan utas. Mungkin utas yang melakukan sakelar konteks.


1
menjalankan pidstat -wt | sort -n -k4 lebih baik.
Ismael Vacco

2

Dalam versi kernel yang lebih baru

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

# then ctrl+c

sudo perf report # inspect the result

Ini akan memberi Anda hasil yang persis tentang peristiwa konteks-switch.

Dan Anda mungkin menemukan alasan yang menyebabkan sakelar konteks dengan menambahkan tanda "-g" (Hasil yang dapat dibaca ditentukan oleh informasi simbol)

sudo perf record -e context-switches -a -g

1

Switch konteks normal. Suatu proses ditugaskan untuk kuanta waktu, jika selesai (atau dihentikan karena kebutuhan sumber daya) apa yang harus dilakukan dapat membiarkan prosesor pergi.

Yang mengatakan untuk menghitung berapa banyak saklar konteks dilakukan (itu menjadi jawaban stackoverflow.com) itu akan mengambil jadwal kernel internal () perintah untuk menulis ke dalam tabel proses. Tidak ada hal seperti itu jika Anda memprogram kernel Anda sendiri Anda akan dapat melihat tetapi itu cukup sulit.


1
Baik. Saya tahu apa itu konteks switch dan apa implikasinya terhadap kinerja sistem. Saya hanya perlu cara untuk mengukur berapa banyak konteks yang dilakukan untuk proses yang mana di linux. Saya sudah menemukan counter csw mentah di / proc / * / stats (voluntary_ctxt_switches)
grzaks

0

powertop dapat memberi tahu Anda seberapa sering suatu proses membangunkan CPU.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.