Linux'ta blok cihazlar için Cache Hit / Miss oranlarını almanın bir yolu var mı?


21

Linux'ta kullanıcı alanından kaç tane okuma ve yazma isteğinin sona erdiğini ve blok cihazlar için önbellek isabetlerine neden olduğunu görmek mümkün mü?

Yanıtlar:


9

Kendi SystemTap betiğinizi geliştirebilirsiniz . Aşağıdaki iki alt sistemi hesaba katmanız gerekir:

  • VFS: Bu, Arabellek önbelleğinden önceki tüm G / Ç isteklerini temsil eder (yani, kesinlikle her G / Ç isteği); "vfs.read", "vfs.write" ve "kernel.function (" vfs_ * ")" problarını gözden geçirin; İzlemek istediğiniz blok cihazlarını ilgili ana + küçük sayıları ile filtrelemeniz gerekir.
  • Blok: bu, G / Ç zamanlayıcısından önce blok aygıtlarına gönderilen tüm G / Ç isteklerini temsil eder (bu, G / Ç isteklerinin birleştirme + sırasını da yapar); burada hangi isteklerin Tampon önbellek tarafından kaçırıldığını biliyoruz; "ioblock.request" probunu gözden geçirin.

SystemTap geliştirme öğrenmek biraz zaman alıyor. Eğer ılımlı bir geliştiriciyseniz ve Linux'ta iyi bilgiye sahipseniz, 3-4 gün içinde yapılmalıdır. Evet, öğrenmesi zaman alır, ancak sonuçlardan çok memnun kalacaksınız - SystemTap size Linux çekirdeğinin neredeyse her yerine probları (güvenle) yerleştirme fırsatı sunar.

Çekirdeğinizin, çekirdek modüllerinin yüklenmesi ve boşaltılması için desteğe sahip olması gerektiğini unutmayın. Günümüzde çoğu stok çekirdeği bunu desteklemektedir. Ayrıca, çekirdeğiniz için hata ayıklama simgelerini yüklemeniz gerekir. Ubuntu sistemim için bu, Ubuntu çekirdek geliştirme ekibinin benim için derlediği birkaç MB MB dosya indirme kadar kolaydı. Bu SystemtapOnUbuntu'da açıklanmıştır örneğin Wiki sayfasında .

PS SystemTap yaklaşımını yalnızca başka bir çözümünüz yoksa kullanın, çünkü öğrenmeniz gereken tamamen yeni bir çerçevedir ve zaman / para ve bazen de hayal kırıklığı yaratır.


1
+1 güzel ve temiz bir açıklama. teşekkür ederim, ben de systemtap ödeme yapacağım.
risyasin,


8

Devam ettim ve bunun için bir senaryo yazdım. Systemtap wiki'de bir tane var, ancak doğru görünmüyor. Temel testlerde bu oldukça doğru, ancak YMMV gibi görünüyor.

#! /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
}


Çalıştırmak için kodunuzu kopyalayıp yapıştırın, aşağıdaki hata oluştuğunda, 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]yardımcı olabilir misiniz?
Fopa Léon Constantin

2

/ proc / slabinfo iyi bir başlangıçtır, ancak size aradığınız bilgileri tam olarak vermez (birden fazla çekirdeği ve istatistiği etkin olan sistemlerdeki hit / miss yüzdelerine almayın; bunlar başka bir şeydir). Bildiğim kadarıyla, bu bilgiyi çekirdekten çıkarmanın bir yolu yok, ancak yapılması gereken biraz kod yazmak çok zor olmamalı.

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


1

Şimdi perf-tools paketindeki cachestat yardımcı programı var .

Yazar ayrıca insanların kullandığı bazı (muhtemelen kırıcı) alternatifleri de listeler:

A) Disk okumalarını izlemek için iostat (1) 'i kullanarak sayfa önbellek kayıp oranını inceleyin ve bunların önbellek kayıpları olduğunu kabul edin, örneğin, O_DIRECT. Kaçırılma oranı genellikle orandan daha önemli bir ölçüttür, çünkü özlenenler uygulama ağrısı ile orantılıdır. Ayrıca önbellek boyutlarını görmek için ücretsiz (1) kullanın.

B) Sayfa önbelleğini (echo 1> / proc / sys / vm / drop_caches) bırakın ve performansın ne kadar kötüye gittiğini ölçün! Negatif bir deneyin kullanımını seviyorum, ancak bu elbette önbellek kullanımına ışık tutmanın acı verici bir yoludur.

C) Sar (1) kullanın ve küçük ve büyük hataları inceleyin. Bunun işe yaradığını sanmıyorum (örneğin normal G / Ç).

D) Linux sayfa önbellek isabet oranı için İnternet aramasında iki numaralı cache-hit-rate.stp SystemTap komut dosyasını kullanın. Herhangi bir dosya sistemine ya da depolama aygıtına okunması için VFS arayüzünde, yığın içinde yüksek önbellek erişimini gösterir. Önbellek özlüyor onların disk G / Ç ile ölçülür. Bu, bazı iş yükü türlerini de özlüyor (bazıları bu sayfadaki "Dersler" bölümünde belirtiliyor) ve oranları "oranları" olarak adlandırıyor.


1

Belirli bir işlemin IO hit / miss oranıyla ilgileniyorsanız, /proc/<pid>/iodosyayı okumak basit ama çok etkili bir yaklaşımdır .

Burada 4 anahtar değer bulacaksınız:

  • rchar: Okuma sayısı gelen bayt uygulama bakış açısından (yani fiziksel depolama yerine, önbellekten tatmin okuma arasında yapılan bir fark ile)
  • wchar: yukarıdaki gibi, ancak yazılan baytlarla ilgili
  • read_bytes: baytlar gerçekten depolama alt sisteminden okundu
  • write_bytes: baytlar gerçekten depolama altsistemine yazılmıştır.

Bir işlemin aşağıdaki değerlere sahip olduğunu söyleyin:

rchar: 1000000
read_bytes: 200000

Okuma önbelleği kaçma oranı (bayt cinsinden) 100*200000/1000000 = 20%ve isabet oranı100-20 = 80%

Bununla birlikte, bir mandal var: Bu rchardeğer, tty IO olarak bir şeyi içerir, bu nedenle bir borudan / boruya çok fazla okuma / yazma işlemleri için yukarıdaki hesaplama çarpıtılır, bu da etkili olandan daha yüksek isabet oranı rapor eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.