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 uptime
menunjukkan beban kecil: load average: 0.01, 0.02, 0.01
dan top
tidak 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 pidstat
keluaran:
# 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?
Jawaban:
Nah, kasus yang cukup menarik. Coba amati
watch -tdn1 cat /proc/interrupts
. Apakah Anda melihat perubahan yang berharga di sana?sumber
Coba gunakan
Opsi 't' juga menampilkan utas. Mungkin utas yang melakukan sakelar konteks.
sumber
Dalam versi kernel yang lebih baru
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)
sumber
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.
sumber
powertop
dapat memberi tahu Anda seberapa sering suatu proses membangunkan CPU.sumber