Leeren Sie den Datei-Cache, um die Leistungstests zu wiederholen

106

Mit welchen Tools oder Techniken kann ich zwischengespeicherte Dateiinhalte entfernen, um zu verhindern, dass meine Leistungsergebnisse verzerrt werden? Ich glaube, ich muss zwischengespeicherte Informationen über Datei- und Verzeichnisinhalte entweder vollständig löschen oder selektiv entfernen.

Die Anwendung, die ich entwickle, ist ein spezialisiertes Komprimierungsprogramm und wird voraussichtlich viel Arbeit beim Lesen und Schreiben von Dateien leisten, die das Betriebssystem in letzter Zeit nicht berührt hat und deren Festplattenblöcke wahrscheinlich nicht zwischengespeichert werden.

Ich möchte die Variabilität entfernen, die ich in der E / A-Zeit sehe, wenn ich die Aufgabe des Profilierens verschiedener Strategien für die Dateiverarbeitungsarbeit wiederhole.

Ich interessiere mich hauptsächlich für Lösungen für Windows XP, da dies mein Hauptentwicklungscomputer ist, aber ich kann auch unter Linux testen und bin daher auch an Antworten für diese Umgebung interessiert.

Ich habe SysInternals CacheSet ausprobiert , aber das Klicken auf "Löschen" führt nicht zu einer messbaren Erhöhung (Wiederherstellung des Timings nach einem Kaltstart) der Zeit zum erneuten Lesen von Dateien, die ich gerade einige Male gelesen habe.

Stephen Denne
quelle
Mögliches Duplikat von Wie wird der Dateisystem-Cache ungültig?
user541686
1
Warum wurde diese Frage gelöscht ?
Dan Dascalescu

Antworten:

82

Verwenden Sie die RAMMap-App von SysInternal .

Rammap leer Standby

Die Menüoption Leere / Leere Standby-Liste löscht den Windows-Dateicache.

kleinste
quelle
2
RAMMap läuft nicht unter Windows XP. Haben diese Menüoptionen etwas anderes als die Schaltfläche "Löschen" in der SysInternals Cacheset-Anwendung?
Stephen Denne
@stephen diese Technik hat unter Windows 8 perfekt für mich funktioniert! Windows XP ist jetzt 12 Jahre alt. Warum können Sie dies unter Vista, Windows 7 oder Windows 8 nicht ausprobieren?
Jeff Atwood
@ Jeff Ich arbeite nicht mehr mit diesen Einschränkungen. "Leere Standby-Liste" führt also zum nächsten Lesevorgang aus einer kürzlich gelesenen Datei, für die Festplatten-E / A erforderlich ist.
Stephen Denne
2
Drücken Sie
3
Einen programmatischen Ansatz finden Sie in diesem SO-Beitrag: stackoverflow.com/a/23085045/430360
snemarch
16

Unter Windows XP sollten Sie in der Lage sein, den Cache für eine bestimmte Datei zu löschen, indem Sie die Datei mithilfe von CreateFile mit den Optionen FILE_FLAG_NO_BUFFERING öffnen und dann das Handle schließen. Dies ist nicht dokumentiert und ich weiß nicht, ob es unter späteren Windows-Versionen funktioniert, aber ich habe dies vor langer Zeit beim Schreiben von Testcode zum Vergleichen von Dateikomprimierungsbibliotheken verwendet. Ich kann mich nicht erinnern, ob der Lese- oder Schreibzugriff diesen Trick beeinflusst hat.


quelle
Funktioniert perfekt für mich unter Windows 7 SP1, x64. Toller Tipp!
cxxl
2
Das muss also für jede Datei wiederholt werden ? Wenn Sie beispielsweise ein Verzeichnis mit 100 MB kopieren, das auf 30 Dateien in 10 Unterverzeichnissen verteilt ist, müssen Sie jedes Verzeichnis einzeln öffnen, um sicherzustellen, dass Sie die tatsächliche Festplatte anstelle des Caches lesen.
Synetech
Andere Antworten auf der Website bestätigen, dass dies auch in Win7 und 8 funktioniert. Ich nehme an, es funktioniert auf Vista. Und ja, Sie müssen es für jede Datei ausführen, aber es dauert nicht allzu lange. Alles, was Sie tun müssen, ist, jede Datei zu öffnen und zu schließen. Wenn Sie schließen, löscht Windows den Cache. Nachdem Sie dies getan haben, führen Sie DANN Ihren Leistungstest durch.
Mooing Duck
1
Dies war eine perfekte Antwort. Einfach zu codieren, effektiv und sollte unter den meisten Windows-Betriebssystemen funktionieren (einschließlich XP, ich habe nur unter Win7x64 getestet). Ich habe die Dateien mit Leseberechtigungen und ohne Freigabe geöffnet. Ich bin mir nicht sicher, welche Kombination wichtig ist.
Rosco
Ähnliche Funktionen unter Linux (ab 2.4.10) mit dem O_DIRECT-Flag im offenen (2) Systemaufruf. Genauer gesagt, nach meinem Verständnis löscht O_DIRECT den Cache für diese Datei nicht, sondern versucht, ihn am besten zu umgehen.
Kaiwan
14

Ein schnelles Googeln bietet diese Optionen für Linux

  1. Hängen Sie die Partition aus und hängen Sie sie ein, in der sich die Dateien befinden
  2. sync && echo 1 > /proc/sys/vm/drop_caches
John Nilsson
quelle
2
Danke, das sieht sehr nützlich aus, obwohl ich möglicherweise 3 statt 1 wiedergeben möchte. Ich interessiere mich hauptsächlich für Windows XP, weshalb ich das beim Googeln nicht gefunden habe.
Stephen Denne
Leider hat die Linux-Umgebung, in der ich dies nutzen könnte, die Kernel-Version 2.6.9. drop_caches wurde in Kernel 2.6.16
Stephen Denne
Viele andere Beiträge, die ich gelesen habe, deuten darauf hin, dass Sie das Dateisystem aushängen und mounten können, um alle zwischengespeicherten Elemente zu entfernen. Ich würde davon ausgehen, dass dies vor 2.6.16 sowie in neueren Kerneln der Fall war.
TafT
12

Ein Befehlszeilenprogramm finden Sie hier

aus der Quelle:

EmptyStandbyList.exe ist ein Befehlszeilenprogramm für Windows (Vista und höher), das leer sein kann:

  • Prozessarbeitssätze,
  • die geänderte Seitenliste,
  • die Standby-Listen (Prioritäten 0 bis 7) oder
  • Nur die Standby-Liste mit Priorität 0.

Verwendung:

EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist
Edwin van Mierlo
quelle
3
Hoch unterschätzte Antwort inmitten all des Lärms, einfaches Dienstprogramm, das einen Job macht und es gut macht. Sie sollten wahrscheinlich mehr Details in die Antwort aufnehmen, um die Upvotes zu erhalten, die Sie verdienen.
Prometheus
3

Ich habe eine Technik gefunden (außer Neustart), die zu funktionieren scheint:

  1. Führen Sie einige Kopien von aus MemAlloc aus
  2. Weisen Sie jedem ein paar Mal große Speicherblöcke zu
  3. Verwenden Sie den Prozess-Explorer, um zu beobachten, wie sich die Größe des Systemcaches auf sehr niedrige Werte reduziert
  4. Beenden Sie die MemAlloc-Programme

Es ist jedoch nicht selektiv. Idealerweise möchte ich in der Lage sein, die spezifischen Teile des Speichers zu löschen, die zum Zwischenspeichern der Plattenblöcke von Dateien verwendet werden, die nicht mehr zwischengespeichert werden sollen.

Stephen Denne
quelle
Dies hat den Nebeneffekt, dass Inhalte in die Auslagerungsdatei verschoben werden, wodurch die Leistung für eine Weile beeinträchtigt wird. Wenn Sie auf einen Kludge zurückgreifen möchten, können Sie auch einfach eine andere große Datei lesen. Zumindest löscht das nur den Festplatten-Cache und sonst nichts.
Synetech
3

Für eine viel bessere Ansicht des Windows XP-Dateisystem-Cache - versuchen Sie es mit ATM von Tim Murgent - können Sie sowohl die Größe des Arbeitssatzes des Dateisystem-Caches als auch die Größe der Standby-Liste in einer detaillierteren und genaueren Ansicht anzeigen. Für Windows XP benötigen Sie die alte Version 1 von ATM, die hier zum Download zur Verfügung steht , da für V2 und V3 Server 2003, Vista oder höher erforderlich ist.

Sie werden feststellen , dass Sysinternals Cacheset zwar den "Cache WS Min" reduziert, die tatsächlichen Daten jedoch weiterhin in Form von Standby-Listen vorhanden sind, von denen aus sie verwendet werden können, bis sie durch etwas anderes ersetzt wurden. Um es dann durch etwas anderes zu ersetzen, verwenden Sie ein Tool wie MemAlloc oder flushmem von Chad Austin oder Consume.exe aus den Windows Server 2003 Resource Kit-Tools .

robertcollier4
quelle
0

Da die Frage auch für Linux gefragt, gibt es eine ähnliche Antwort hier .

Mit dem Kommandozeilen-Tool vmtouch können unter anderem Dateien und Verzeichnisse zum Systemdateicache hinzugefügt und daraus entfernt werden.

Sucher
quelle