Solusi 1:
Anda dapat mengembangkan skrip SystemTap Anda sendiri. Anda perlu memperhitungkan dua subsistem berikut:
- VFS:ini mewakili semua permintaan I/O sebelum cache Buffer (yaitu, benar-benar setiap permintaan I/O); tinjau probe "vfs.read", "vfs.write", dan "kernel.function("vfs_*")"; Anda perlu memfilter perangkat blokir yang ingin Anda pantau dengan nomor mayor+minor masing-masing.
- Blokir:ini mewakili semua permintaan I/O yang dikirim ke perangkat blok sebelum penjadwal I/O (yang juga menggabungkan + menyusun ulang permintaan I/O); di sini kita tahu permintaan mana yang terlewatkan oleh cache Buffer; tinjau penyelidikan "ioblock.request".
Pengembangan SystemTap membutuhkan waktu untuk dipelajari. Jika Anda adalah pengembang moderat dan memiliki pengetahuan yang baik tentang Linux, Anda harus menyelesaikannya dalam 3-4 hari. Ya, perlu waktu untuk mempelajarinya, tetapi Anda akan sangat senang dengan hasilnya - SystemTap memberi Anda kesempatan untuk (dengan aman) meletakkan probe di hampir semua tempat di kernel Linux.
Perhatikan bahwa kernel Anda harus memiliki dukungan untuk memuat dan membongkar modul kernel. Sebagian besar kernel stok saat ini mendukung ini. Anda juga perlu memasang simbol debug untuk kernel Anda. Untuk sistem Ubuntu saya, ini semudah mengunduh file .deb beberapa ratus MB, yang dikompilasi oleh tim pengembangan kernel Ubuntu untuk saya. Ini dijelaskan di halaman Wiki SystemtapOnUbuntu, misalnya.
P.S. Ambil pendekatan SystemTap hanya jika Anda tidak memiliki solusi lain, karena ini adalah kerangka kerja yang sama sekali baru yang harus Anda pelajari, dan itu menghabiskan waktu/uang dan terkadang membuat frustrasi.
Solusi 2:
Saya melanjutkan dan menulis skrip stap untuk ini. Ada satu di wiki systemtap, tetapi tampaknya tidak benar. Dalam pengujian dasar, ini tampak cukup akurat tetapi YMMV.
#! /usr/bin/env stap
global total_bytes, disk_bytes, counter
probe vfs.read.return {
if (bytes_read>0) {
if (devname=="N/A") {
} else {
total_bytes += bytes_read
}
}
}
probe ioblock.request
{
if (rw == 0 && size > 0)
{
if (devname=="N/A") {
} else {
disk_bytes += size
}
}
}
# print VFS hits and misses every 5 second, plus the hit rate in %
probe timer.s(5) {
if (counter%15 == 0) {
printf ("\n%18s %18s %10s %10s\n",
"Cache Reads (KB)", "Disk Reads (KB)", "Miss Rate", "Hit Rate")
}
cache_bytes = total_bytes - disk_bytes
if (cache_bytes < 0)
cache_bytes = 0
counter++
hitrate = 10000 * cache_bytes / (cache_bytes+disk_bytes)
missrate = 10000 * disk_bytes / (cache_bytes+disk_bytes)
printf ("%18d %18d %6d.%02d%% %6d.%02d%%\n",
cache_bytes/1024, disk_bytes/1024,
missrate/100, missrate%100, hitrate/100, hitrate%100)
total_bytes = 0
disk_bytes = 0
}
Solusi 3:
/proc/slabinfo adalah awal yang baik, tetapi tidak memberi Anda cukup informasi yang Anda cari (jangan tertipu oleh persentase hit/miss pada sistem dengan banyak inti dan statistik diaktifkan; itu adalah hal lain). Sejauh yang saya tahu, tidak ada cara untuk mengeluarkan informasi tertentu dari kernel, meskipun seharusnya tidak terlalu sulit untuk menulis sedikit kode.
Sunting:http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html
Solusi 4:
Sekarang ada utilitas cachestat dari paket perf-tools.
Penulis juga mencantumkan beberapa (mungkin lebih kasar) alternatif yang digunakan orang:
A) Pelajari tingkat kesalahan cache halaman dengan menggunakan iostat(1) untuk memantau pembacaan disk, dan anggap ini adalah kesalahan cache, dan bukan, misalnya, O_DIRECT. Tingkat kesalahan biasanya merupakan metrik yang lebih penting daripada rasio, karena kesalahan sebanding dengan rasa sakit aplikasi. Gunakan juga free(1) untuk melihat ukuran cache.
B) Jatuhkan cache halaman (echo 1> /proc/sys/vm/drop_caches), dan ukur berapa banyak kinerja yang memburuk! Saya suka penggunaan eksperimen negatif, tetapi ini tentu saja cara yang menyakitkan untuk menjelaskan penggunaan cache.
C) Gunakan sar(1) dan pelajari kesalahan minor dan mayor. Saya rasa ini tidak berfungsi (misalnya, I/O reguler).
D) Gunakan skrip SystemTap cache-hit-rate.stp, yang merupakan nomor dua dalam pencarian Internet untuk rasio hit cache halaman Linux. Ini menginstrumen akses cache yang tinggi di tumpukan, di antarmuka VFS, sehingga pembacaan ke sistem file atau perangkat penyimpanan apa pun dapat dilihat. Cache miss diukur melalui disk I/O mereka. Ini juga melewatkan beberapa jenis beban kerja (beberapa disebutkan dalam "Pelajaran" di halaman tersebut), dan memanggil rasio "tarif".