Saya memiliki kernel 2.6.35 PREEMPT yang berjalan pada prosesor ARMv7 kecepatan sedang. Kira-kira sekali setiap 100 - 125an, sesuatu menyebabkan kernel gagal memproses beberapa driver terkait audio dengan cukup cepat untuk menghindari underruns. Penahanan umumnya dalam kisaran 15-30 ms, tetapi bisa sangat lama. Tidak jelas apakah hold-up sepenuhnya in-kernel atau mungkin berhubungan dengan penjadwalan proses pengguna yang berjalan dengan prioritas waktu nyata (SCHED_RR, 2).
Dugaan saya adalah bahwa ada (setidaknya satu) pengemudi yang tidak bermain baik dengan mendahului.
Beberapa keluaran strace dari proses pengguna menggambarkan beberapa aspek perilaku normal dan abnormal, meskipun saya tidak yakin bagaimana menafsirkan berbagai laporan waktu?
Kasus normal:
0,000518 jajak pendapat ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3415) = 1 Poling 0,010202 ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 0,000585 jajak pendapat ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 0,000302 poling ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 Polling 0,010706 ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3393) = 1 0,000480 jajak pendapat ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3392) = 1
Tidak ada pemblokiran yang terjadi pada polling untuk output pada fd6 dan, ketika hanya fd10 yang disurvei untuk input, blok sekitar 10ms terjadi. Ini tercermin baik dalam laporan durasi panggilan sistem dan interval antara panggilan sistem (konsisten).
Kasus kegagalan (contoh ekstrem):
0,000305 polling ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3543) = 1 0,010730 jajak pendapat ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3533) = 1 0,000475 jajak pendapat ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3532) = 1 0,000329 poling ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3532) = 1 0.953349 poling ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT | POLLERR}], 2, 2578) = 1
Perhatikan dalam hal ini bahwa, meskipun panggilan kedua-terakhir dicatat sebagai mengambil 10 ms (normal), itu adalah 953 ms sebelum panggilan terakhir.
Alat apa yang bisa saya gunakan untuk melacak pelakunya?
Jawaban:
perf
semoga bermanfaat bagi anda. Ini adalah bagian dari utilitas kernel linux.Misalnya:
Ini akan menampilkan semua waktu masuk / keluar syscall dan parameter (seperti strace), memberikan nama biner yang memanggil syscall dan sampel callstack setiap CPU pada beberapa frekuensi (termasuk simbol kernel). Jadi Anda benar-benar dapat melihat kode apa yang dijalankan selama syscall. Dalam sistem multiprosesor, Anda perlu memperhatikan id cpu (mis. [001]).
sumber
Mungkin
atop
bisa menjelaskan masalah Anda.Ini dapat menunjukkan proses yang sudah keluar, dan itu dapat menunjukkan penggunaan CPU , Memori , Disk dan Jaringan .
Anda dapat menjalankannya secara interaktif, membiarkannya menulis ke file teks atau menjalankannya seperti
sar
dalam interval yang telah ditentukan, membuat file riwayat biner yang dapat Anda selesaikan setelahnya.Saya menggunakannya untuk menemukan semua jenis babi yang sulit ditemukan :-)
sumber