Gibt es eine Möglichkeit, Cache-Treffer- / Fehlerquoten für Blockgeräte unter Linux abzurufen?

21

Ist es unter Linux möglich zu sehen, wie viele Lese- und Schreibanforderungen aus dem Benutzerbereich Cachetreffer und -fehler für Blockgeräte verursachen?

Kyle Brandt
quelle

Antworten:

9

Sie können Ihr eigenes SystemTap- Skript entwickeln. Sie müssen die folgenden zwei Subsysteme berücksichtigen:

  • VFS: Dies stellt alle E / A-Anforderungen vor dem Puffercache dar (dh absolut jede E / A-Anforderung). Überprüfen Sie die Tests "vfs.read", "vfs.write" und "kernel.function (" vfs_ * ")". Sie müssen die Blockgeräte, die Sie überwachen möchten, nach ihren jeweiligen Haupt- und Nebennummern filtern.
  • Block: Dies stellt alle E / A-Anforderungen dar, die an die Blockgeräte vor dem E / A-Scheduler gesendet wurden (wobei auch die Reihenfolge der E / A-Anforderungen + zusammengeführt wird). hier wissen wir, welche Anfragen vom Buffer Cache verpasst wurden; Überprüfen Sie die Probe "ioblock.request".

Die Entwicklung von SystemTap nimmt einige Zeit in Anspruch. Wenn Sie ein moderater Entwickler sind und gute Linux-Kenntnisse haben, sollten Sie in 3-4 Tagen fertig sein. Ja, es dauert eine Weile, bis Sie es gelernt haben, aber Sie werden mit den Ergebnissen sehr zufrieden sein. Mit SystemTap haben Sie die Möglichkeit, Tests (sicher) an fast jeder Stelle im Linux-Kernel zu platzieren.

Beachten Sie, dass Ihr Kernel Unterstützung für das Laden und Entladen von Kernel-Modulen haben muss. Die meisten Aktienkerne unterstützen dies heutzutage. Sie müssen auch die Debugsymbole für Ihren Kernel installieren. Für mein Ubuntu-System war dies so einfach wie das Herunterladen einer .deb-Datei mit mehreren hundert MB, die das Ubuntu-Kernel-Entwicklungsteam für mich kompiliert hat. Dies wird beispielsweise auf der SystemtapOnUbuntu- Wiki-Seite erklärt .

PS: Verwenden Sie den SystemTap-Ansatz nur, wenn Sie keine andere Lösung haben, da es sich um ein völlig neues Framework handelt, das Sie lernen müssen und das Zeit / Geld und manchmal Frust kostet.

Famzah
quelle
1
+1 nette und saubere Erklärung. Danke, ich werde auch systemtap auschecken.
Risyasin
Ein SystemTap-Skript dafür befindet sich in ihrem Wiki.
Michael Hampton
8

Ich ging voran und schrieb ein Stap-Skript dafür. Es gibt eines im Systemtap-Wiki, aber es scheint nicht korrekt zu sein. Im Basistest scheint dies ziemlich genau zu sein, 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
}
Dave Wright
quelle
Genial! Ich habe eine kleine durchschnittliche Cache-Nutzungsstatistik hinzugefügt, um sie auszudrucken, wenn Sie sie schließen: pastie.org/1845683
entropo
Ich habe Ihren Code kopiert / eingefügt, um ihn auszuführen. Wenn der folgende Fehler aufgetreten ist, 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]können Sie helfen?
Fopa Léon Constantin
2

/ proc / slabinfo ist ein guter Anfang, bietet aber nicht die gewünschten Informationen. Soweit ich weiß, gibt es keine Möglichkeit, diese bestimmten Informationen aus dem Kernel zu ziehen, obwohl es nicht fürchterlich schwierig sein sollte, ein bisschen Code zu schreiben, um dies zu tun.

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

BMDan
quelle
1

Jetzt gibt es das Dienstprogramm cachestat aus dem Paket perf-tools .

Der Autor listet auch einige (möglicherweise grausamere) Alternativen auf, die von Menschen verwendet werden:

A) Untersuchen Sie die Seiten-Cache-Fehlerrate, indem Sie iostat (1) zum Überwachen von Festplattenlesevorgängen verwenden, und nehmen Sie an, dass dies Cache-Fehler sind, und nicht beispielsweise O_DIRECT. Die Fehlschlagrate ist in der Regel ohnehin eine wichtigere Kennzahl als das Verhältnis, da Fehlschläge proportional zum Schmerz bei der Anwendung sind. Verwenden Sie auch free (1), um die Cache-Größen anzuzeigen.

B) Löschen Sie den Seiten-Cache (echo 1> / proc / sys / vm / drop_caches) und messen Sie, wie viel Leistung schlechter wird! Ich mag die Verwendung eines negativen Experiments, aber dies ist natürlich ein schmerzhafter Weg, um etwas Licht in die Cache-Nutzung zu bringen.

C) Verwenden Sie sar (1) und untersuchen Sie kleinere und größere Fehler. Ich denke nicht, dass dies funktioniert (z. B. reguläre E / A).

D) Verwenden Sie das SystemTap-Skript cache-hit-rate.stp, das die Nummer zwei bei einer Internetsuche nach der Trefferquote für den Linux-Seiten-Cache ist. Es misst den Cache-Zugriff im Stapel in der VFS-Schnittstelle, sodass Lesevorgänge für jedes Dateisystem oder Speichergerät sichtbar sind. Cache-Fehler werden über ihre Festplatten-E / A gemessen. Hierdurch werden auch einige Auslastungstypen übersehen (einige werden auf dieser Seite unter "Lektionen" erwähnt), und die Quoten werden als "Raten" bezeichnet.

Zitronenpresse
quelle
1

Wenn Sie sich für das E / A-Treffer / Fehler-Verhältnis eines bestimmten Prozesses interessieren, ist das Lesen der /proc/<pid>/ioDatei ein einfacher, aber sehr effektiver Ansatz .

Hier finden Sie 4 Schlüsselwerte:

  • rchar: Die Gesamtzahl der gelesenen Bytes aus Sicht der Anwendung (dh, es wird 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 tatsächlich aus dem Speichersubsystem gelesenen Bytes
  • write_bytes: Die tatsächlich in das Speichersubsystem geschriebenen Bytes

Angenommen, ein Prozess hat die folgenden Werte:

rchar: 1000000
read_bytes: 200000

Die Read Cache Miss Ratio (in Bytes) ist 100*200000/1000000 = 20%und die Hit Ratio ist100-20 = 80%

Es gibt jedoch einen Haken: Der rcharWert enthält den Wert "tty IO". Bei Prozessen, die viel von einer Pipe lesen / in eine Pipe schreiben, wird die obige Berechnung verzerrt und weist eine höhere Trefferquote auf als die effektive.

Shodanshok
quelle