Temukan babi kernel CPU sesekali


11

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?


2
Poin bonus untuk pertanyaan menarik. Saya tidak yakin bagaimana menjawabnya, tetapi saya memiliki pertanyaan tentang bagaimana cara melacaknya kembali ke penggunaan CPU (sebagai lawan dari lonjakan di iowait, misalnya)?
Bratchley

1
Dugaan pertama adalah jika Anda menjalankan JFFS2 atau YAFFS pada NAND flash besar, terutama jika Anda sedang merekam. Nonaktifkan apa pun yang menulis ke flash dan lihat apakah itu membantu. Seperti apa tabel proses Anda? Anda dapat menggunakan ftrace sebagai pilihan terakhir jika Anda memiliki toolchain untuk membangun kernel.
Jonathan Ben-Avraham

sar -bu mungkin melakukannya .. linux.die.net/man/1/sar
Grizly

Ada beberapa flash yang digunakan; kartu SD dengan sistem file ext4 yang terpasang. Dan menulis untuk itu memang sumber yang mungkin dari masalah ini (tapi mengapa, tepatnya?) Tetapi mungkin bukan satu-satunya.
awy

Jawaban:


1

perfsemoga bermanfaat bagi anda. Ini adalah bagian dari utilitas kernel linux.

Misalnya:

perf record -R -a -g fp -e cycles -e syscalls:sys_enter_poll -e syscalls:sys_exit_poll
#Just ctrl+c if you are done, and view ith
perf script 

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


Saya akan melihat bagaimana membuat perf dibangun untuk platform - terima kasih atas tipnya.
awy

0

Mungkin atopbisa 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 sardalam interval yang telah ditentukan, membuat file riwayat biner yang dapat Anda selesaikan setelahnya.

Saya menggunakannya untuk menemukan semua jenis babi yang sulit ditemukan :-)

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.