Apakah ada cara untuk mendapatkan rasio Cache Hit / Miss untuk perangkat blok di Linux?

21

Apakah mungkin untuk melihat di Linux berapa banyak permintaan baca dan tulis dari ruang pengguna yang akhirnya menyebabkan hit dan miss cache untuk perangkat blok?

Kyle Brandt
sumber

Jawaban:

9

Anda dapat mengembangkan skrip SystemTap Anda sendiri . Anda perlu memperhitungkan dua subsistem berikut:

  • VFS: ini mewakili semua permintaan I / O sebelum Buffer cache (yaitu benar-benar setiap permintaan I / O); tinjau probe "vfs.read", "vfs.write" dan "kernel.function (" vfs_ * ")"; Anda perlu memfilter perangkat blok yang ingin Anda pantau dengan nomor utama + minor masing-masing.
  • Block: 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 probe "ioblock.request".

Pengembangan SystemTap membutuhkan waktu untuk dipelajari. Jika Anda adalah pengembang moderat dan memiliki pengetahuan yang baik di Linux, Anda harus melakukannya dalam 3-4 hari. Ya, itu butuh waktu untuk belajar, 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. Kebanyakan kernel saat ini mendukung hal ini. Anda juga harus menginstal simbol debug untuk kernel Anda. Untuk sistem Ubuntu saya, ini semudah mengunduh beberapa ratus MB file deb, yang dikompilasi oleh tim pengembangan kernel Ubuntu untuk saya. Ini dijelaskan di halaman SystemtapOnUbuntu Wiki, misalnya.

PS Ambil pendekatan SystemTap hanya jika Anda tidak memiliki solusi lain, karena ini merupakan kerangka kerja yang sama sekali baru yang harus Anda pelajari, dan itu membutuhkan waktu / uang dan kadang-kadang frustrasi.

famzah
sumber
1
+1 penjelasan bagus & bersih. terima kasih, saya akan checkout systemtap juga.
risyasin
Skrip SystemTap untuk ini ada di wiki mereka.
Michael Hampton
8

Saya pergi ke depan dan menulis naskah untuk ini. Ada satu di systemtap wiki, tetapi tampaknya itu tidak benar. Dalam pengujian dasar, ini terlihat 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
}
Dave Wright
sumber
Luar biasa! Saya menambahkan stat penggunaan cache rata-rata kecil untuk mencetak ketika Anda menutupnya: pastie.org/1845683
entropo
Saya telah menyalin / menempelkan kode Anda untuk menjalankannya, dengan kesalahan berikut terjadi, semantic error: unable to find member 'bi_size' for struct bio (alternatives: bi_next bi_bdev bi_flags bi_rw bi_iter bi_phys_segments bi_seg_front_size bi_seg_back_size bi_remaining bi_end_io bi_private bi_ioc bi_css bi_integrity bi_vcnt bi_max_vecs bi_cnt bi_io_vec bi_pool bi_inline_vecs): operator '->' at /usr/share/systemtap/tapset/linux/ioblock.stp:113:20 source: size = $bio->bi_size ^ Pass 2: analysis failed. [man error::pass2]dapatkah Anda membantu?
Fopa Léon Constantin
2

/ proc / slabinfo adalah awal yang baik, tetapi tidak memberi Anda cukup informasi yang Anda cari (jangan tertipu oleh persentase hit / miss pada sistem dengan beberapa core dan statistik diaktifkan; itu adalah sesuatu yang lain). Sejauh yang saya tahu, tidak ada cara untuk menarik informasi tertentu dari kernel, meskipun seharusnya tidak terlalu sulit untuk menulis sedikit kode untuk dilakukan.

Edit: http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html

BMDan
sumber
1

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 memonitor pembacaan disk, dan anggap ini adalah cache yang terlewat, dan bukan, misalnya, O_DIRECT. Tingkat kesalahan biasanya merupakan metrik yang lebih penting daripada rasio, karena kesalahan proporsional dengan rasa sakit aplikasi. Juga gunakan gratis (1) untuk melihat ukuran cache.

B) Jatuhkan cache halaman (gema 1> / proc / sys / vm / drop_caches), dan ukur seberapa besar kinerja yang semakin buruk! Saya suka menggunakan eksperimen negatif, tapi ini tentu saja cara yang menyakitkan untuk menjelaskan penggunaan cache.

C) Gunakan sar (1) dan pelajari kesalahan kecil dan utama. Saya tidak berpikir ini bekerja (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 instrumen akses cache tinggi di stack, di antarmuka VFS, sehingga membaca ke sistem file atau perangkat penyimpanan dapat dilihat. Cache misses diukur melalui disk I / O mereka. Ini juga merindukan beberapa jenis beban kerja (beberapa disebutkan dalam "Pelajaran" pada halaman itu), dan menyebut rasio "tarif".

perasan lemon
sumber
1

Jika Anda tertarik pada rasio hit / miss IO dari proses tertentu, pendekatan sederhana namun sangat efektif adalah membaca /proc/<pid>/iofile.

Di sini Anda akan menemukan 4 nilai utama:

  • rchar: total jumlah byte yang dibaca dari sudut pandang aplikasi (yaitu: tanpa perbedaan yang dibuat antara read puas dari penyimpanan fisik daripada dari cache)
  • wchar: seperti di atas, tetapi tentang byte yang ditulis
  • read_bytes: byte benar-benar dibaca dari subsistem penyimpanan
  • write_bytes: byte benar-benar ditulis ke subsistem penyimpanan

Katakanlah suatu proses memiliki nilai berikut:

rchar: 1000000
read_bytes: 200000

Rasio cache cache baca (dalam byte) adalah 100*200000/1000000 = 20%, dan rasio hit adalah100-20 = 80%

Namun ada satu hal yang menarik: rcharnilainya mencakup tty IO, jadi untuk proses yang membaca / menulis banyak dari / ke pipa perhitungan di atas akan miring, melaporkan rasio hit yang lebih tinggi daripada yang efektif.

shodanshok
sumber