Sekarang pada waktunya, saya telah berhasil menyelesaikan ini sendiri, jadi saya setidaknya bisa menindaklanjutinya sendiri untuk anak cucu.
Sayangnya, saya kehilangan masalah asli dalam peningkatan kernel, tetapi mendapatkan yang baru sebagai gantinya, bahkan lebih buruk dalam kinerja, dan sama sulit untuk dilacak. Teknik yang saya temukan adalah sebagai berikut:
Pertama-tama, blktrace
/ blkparse
adalah alat yang saya temukan cukup membantu. Ini memungkinkan penelusuran kemajuan permintaan I / O individu dengan banyak detail bermanfaat, seperti proses yang mengirimkan permintaan. Akan sangat membantu untuk tmpfs
mengaktifkan output , sehingga penanganan penyimpanan jejak tidak mulai melacak sendiri.
Itu hanya membantu sejauh ini, jadi saya mengkompilasi kernel dengan lebih banyak fungsi debugging. Secara khusus, saya merasa ftrace
cukup membantu, karena memungkinkan saya untuk melacak proses yang berkinerja buruk di dalam ruang kernel, untuk melihat apa yang dilakukannya dan di mana ia diblokir. Mengkompilasi kernel debug juga memberikan WCHAN
hasil kerja ps
, yang dapat bekerja sebagai cara yang lebih mudah untuk melihat apa yang sedang dilakukan proses di dalam kernel, setidaknya untuk kasus yang lebih sederhana.
Saya juga berharap agar LatencyTop bermanfaat, tetapi saya merasa cukup bermasalah, dan juga hanya menampilkan alasan latensi yang terlalu "tingkat tinggi" untuk benar-benar berguna, sayangnya.
Juga, saya merasa lebih bermanfaat daripada iostat
hanya melihat konten /sys/block/$DEVICE/stat
pada interval yang sangat dekat, seperti ini:
while :; do cat /sys/block/sda/stat; sleep .1; done
Lihat Documentation/iostats.txt
di pohon sumber kernel untuk format stat
file. Melihatnya dalam jarak dekat memungkinkan saya untuk melihat waktu dan ukuran yang tepat dari ledakan I / O dan hal-hal semacam itu.
Pada akhirnya, saya menemukan bahwa masalah yang saya miliki setelah peningkatan kernel disebabkan oleh halaman yang stabil , sebuah fitur yang diperkenalkan di Linux 3.0, menyebabkan, dalam kasus saya, Berkeley DB berhenti untuk waktu yang lama ketika mengotori halaman dalam mmap'ednya file wilayah. Meskipun tampaknya mungkin untuk menambal fitur ini, dan juga bahwa masalah yang ditimbulkannya mungkin diperbaiki di Linux 3.9, saya telah memecahkan masalah terburuk yang saya miliki untuk saat ini dengan menambal Berkeley DB untuk memungkinkan saya meletakkan file wilayahnya di direktori yang berbeda (dalam kasus saya /dev/shm
), memungkinkan saya untuk menghindari masalah sama sekali.