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?
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?
Jawaban:
Anda dapat mengembangkan skrip SystemTap Anda sendiri . Anda perlu memperhitungkan dua subsistem berikut:
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.
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
}
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?
/ 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
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".
Jika Anda tertarik pada rasio hit / miss IO dari proses tertentu, pendekatan sederhana namun sangat efektif adalah membaca /proc/<pid>/io
file.
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 ditulisread_bytes
: byte benar-benar dibaca dari subsistem penyimpananwrite_bytes
: byte benar-benar ditulis ke subsistem penyimpananKatakanlah 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: rchar
nilainya 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.