Ist es unter Linux möglich zu sehen, wie viele Lese- und Schreibanforderungen aus dem Benutzerbereich Cachetreffer und -fehler für Blockgeräte verursachen?
Ist es unter Linux möglich zu sehen, wie viele Lese- und Schreibanforderungen aus dem Benutzerbereich Cachetreffer und -fehler für Blockgeräte verursachen?
Antworten:
Sie können Ihr eigenes SystemTap- Skript entwickeln. Sie müssen die folgenden zwei Subsysteme berücksichtigen:
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.
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
}
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?
/ 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
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.
Wenn Sie sich für das E / A-Treffer / Fehler-Verhältnis eines bestimmten Prozesses interessieren, ist das Lesen der /proc/<pid>/io
Datei 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 Bytesread_bytes
: Die tatsächlich aus dem Speichersubsystem gelesenen Byteswrite_bytes
: Die tatsächlich in das Speichersubsystem geschriebenen BytesAngenommen, 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 rchar
Wert 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.