Frage Gibt es eine Möglichkeit, Cache Hit / Miss-Verhältnisse für Block-Geräte in Linux zu erhalten?


Ist es unter Linux möglich zu sehen, wie viele Lese- und Schreibanforderungen aus dem Benutzerbereich Cache-Treffer und Fehltreffer für Block-Geräte verursachen?


21
2017-07-05 15:43


Ursprung




Antworten:


Sie können Ihre eigenen entwickeln Systemtabelle Skript. Sie müssen die folgenden zwei Subsysteme berücksichtigen:

  • VFS: Dies stellt alle E / A-Anforderungen vor dem Puffercache dar (d. H. Absolut jede E / A-Anforderung); Überprüfen Sie die Tests "vfs.read", "vfs.write" und "kernel.function (" vfs_ * ")"; Sie müssen die Blockgeräte herausfiltern, die Sie mit ihren jeweiligen Major + Minor-Nummern überwachen möchten.
  • Block: Dies stellt alle E / A-Anforderungen dar, die an die Blockgeräte vor dem E / A-Scheduler gesendet wurden (der auch die E / A-Anforderungen zusammenführt und neu anordnet); Hier wissen wir, welche Anfragen vom Puffer-Cache verpasst wurden. Überprüfen Sie die Sonde "ioblock.request".

Die Entwicklung von SystemTap benötigt etwas Zeit zum Lernen. Wenn Sie ein moderater Entwickler sind und gute Kenntnisse in Linux haben, sollten Sie in 3-4 Tagen fertig sein. Ja, es braucht Zeit, um zu lernen, aber Sie werden mit den Ergebnissen sehr zufrieden sein - SystemTap gibt Ihnen die Möglichkeit, Sonden an fast jedem Ort im Linux-Kernel (sicher) zu installieren.

Beachten Sie, dass Ihr Kernel Unterstützung für das Laden und Entladen von Kernel-Modulen haben muss. Die meisten Lagerkerne unterstützen dies heutzutage. Sie müssen auch die Debug-Symbole für Ihren Kernel installieren. Für mein Ubuntu-System war das so einfach wie das Herunterladen einer mehrere hundert MB großen .deb-Datei, die das Ubuntu-Kernel-Entwicklungsteam für mich kompiliert hat. Dies wird im. Erklärt SystemtapOnUbuntu Wiki-Seite zum Beispiel.

P.S. Nehmen Sie den SystemTap-Ansatz nur dann, wenn Sie keine andere Lösung haben, weil es ein völlig neues Framework ist, das Sie lernen müssen, und das kostet Zeit / Geld und manchmal Frustration.


9
2017-07-06 06:44



+1 schöne und saubere Erklärung. Danke, ich werde auch System tappen. - risyasin
Ich bin wirklich aufgeregt, damit zu spielen! Vielen Dank! - Kyle Brandt♦
Ein SystemTap-Skript dafür ist in ihrem Wiki. - Michael Hampton♦


Ich ging weiter und schrieb dafür ein Stap-Script. Es gibt eine im Systemtap-Wiki, aber es scheint nicht korrekt zu sein. In grundlegenden Tests erscheint dies ziemlich genau, aber 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
}

8
2018-04-28 14:39



Genial! Ich habe einen kleinen durchschnittlichen Cache-Verwendungsstatus hinzugefügt, um ihn auszudrucken, wenn Sie ihn schließen: pastie.org/1845683 - entropo
Ich habe deinen Code kopiert / eingefügt, um ihn auszuführen, indem der folgende Fehler auftrat, 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] kannst du helfen ? - Fopa Léon Constantin


/ proc / slabinfo ist ein guter Anfang, liefert aber nicht die Informationen, nach denen Sie suchen (lassen Sie sich nicht durch die Treffer- / Fehlschlag-Prozentsätze auf Systemen mit mehreren Kernen und aktivierten Stats täuschen; diese sind etwas anderes). Soweit ich weiß, gibt es keine Möglichkeit, diese spezielle Information aus dem Kernel herauszuholen, obwohl es nicht sehr schwierig sein sollte, ein bisschen Code zu schreiben.

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


2
2017-07-05 16:52





Jetzt gibt es das Cachestat Dienstprogramm von Perf-Werkzeuge Paket.

Der Autor führt auch einige (möglicherweise gröbere) Alternativen auf, die Menschen verwenden:

A) Untersuchen Sie die Fehltrefferrate des Seitencaches, indem Sie mit iostat (1) die Plattenlesevorgänge überwachen, und gehen Sie davon aus, dass es sich um Cache-Fehltreffer handelt, und nicht beispielsweise um O_DIRECT. Die Miss-Rate ist in der Regel eine wichtigere Metrik als das Verhältnis, da Misses proportional zum Applikationsschmerz sind. Verwenden Sie außerdem free (1), um die Cachegrößen anzuzeigen.

B) Löschen Sie den Seitencache (echo 1> / proc / sys / vm / drop_caches) und messen Sie, wie viel Leistung schlechter wird! Ich liebe die Verwendung eines negativen Experiments, aber das ist natürlich eine schmerzhafte Methode, etwas Licht auf die Cache-Nutzung zu werfen.

C) Benutze sar (1) und studiere kleinere und größere Fehler. Ich glaube nicht, dass das funktioniert (zB reguläre I / O).

D) Verwenden Sie das Script cache-hit-rate.stp SystemTap, das in einer Internet-Suche nach der Trefferquote des Seitencaches für Linux die Nummer zwei ist. Es überwacht den Cache-Zugriff hoch im Stapel in der VFS-Schnittstelle, so dass Lesevorgänge in jedes Dateisystem oder Speichergerät angezeigt werden. Cache-Misses werden über ihre Festplatten-E / A gemessen. Dies schließt auch einige Workload-Typen aus (einige sind in "Lessons" auf dieser Seite erwähnt) und nennt "rates".


1
2018-04-24 12:18





Wenn Sie sich für das I / O - Verhältnis eines bestimmten Prozesses interessieren, ist ein einfacher, aber sehr effektiver Ansatz das Lesen des /proc/<pid>/io Datei.

Hier finden Sie 4 Schlüsselwerte:

  • rchar: Die Gesamtanzahl der gelesenen Bytes von Anwendungsgesichtspunkt (dh: Es wurde kein Unterschied zwischen dem Lesen aus dem physischen Speicher und nicht aus dem Cache gemacht)
  • wchar: wie oben, aber über geschriebene Bytes
  • read_bytes: die Bytes Ja wirklich Lesen aus dem Speichersubsystem
  • write_bytes: die Bytes Ja wirklich in das Speichersubsystem geschrieben

Angenommen, ein Prozess hat die folgenden Werte:

rchar: 1000000
read_bytes: 200000

Das Lese-Cache-Miss-Verhältnis (in Bytes) ist 100*200000/1000000 = 20%und die Trefferquote ist 100-20 = 80%

Es gibt jedoch einen Haken: die rchar value beinhaltet ding wie tty IO, also wird bei Prozessen, die viel von / zu einer Pipe lesen / schreiben, die obige Berechnung verzerrt sein, was eine höhere Trefferquote als die effektive ergibt.


1
2018-04-24 15:45