Welche Tools oder Techniken kann ich verwenden, um zwischengespeicherte Dateiinhalte zu entfernen, um zu verhindern, dass meine Leistungsergebnisse verzerrt werden? Ich glaube, ich muss zwischengespeicherte Informationen zu Datei- und Verzeichnisinhalten entweder vollständig löschen oder selektiv entfernen.
Die Anwendung, die ich gerade entwickle, ist ein spezialisiertes Komprimierungsprogramm. Es wird erwartet, dass sie beim Lesen und Schreiben von Dateien, die das Betriebssystem in letzter Zeit nicht berührt hat und deren Plattenblöcke wahrscheinlich zwischengespeichert werden, eine Menge Arbeit erledigt.
Ich möchte die Variabilität beseitigen, die ich in der Zeit IO sehe, wenn ich die Aufgabe des Profilierens verschiedener Strategien für die Dateiverarbeitung wiederhole.
Ich bin vor allem an Lösungen für Windows XP interessiert, da dies meine Hauptentwicklungsmaschine ist, aber ich kann auch mit Linux testen und bin daher 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) in der Zeit, um Dateien erneut zu lesen, die ich gerade ein paar Mal gelesen habe.
Verwenden Sie SysInternals RAMMap-App .
Die Menüoption Empty/Empty Standby List löscht den Windows-Dateicache.
Eine schnelle Suche bietet diese Optionen für Linux
sync && echo 1 > /proc/sys/vm/drop_caches
Unter Windows XP sollten Sie den Cache für eine bestimmte Datei löschen können, indem Sie die Datei mit CreateFile mit den Optionen FILE_FLAG_NO_BUFFERING öffnen und dann den Griff schließen. Dies ist nicht dokumentiert, und ich weiß nicht, ob es mit 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.
Ein Befehlszeilen-Dienstprogramm finden Sie hier
von der Quelle:
EmptyStandbyList.exe
ist ein Befehlszeilentool für Windows (Vista und oben), das Folgendes leeren kann:
- prozessarbeitssätze,
- die modifizierte Seitenliste,
- die Standby-Listen (Prioritäten 0 bis 7) oder
- nur die Standby-Liste mit Priorität 0.
Verwendungszweck:
EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist
#include <fcntl.h>
int posix_fadvise(int fd, off_t offset, off_t len, int advice);
mit Beratungsoption POSIX_FADV_DONTNEED
:
Auf die angegebenen Daten wird in naher Zukunft nicht zugegriffen.
Um einen besseren Überblick über den Dateisystemcache von Windows XP zu erhalten, probieren Sie ATM von Tim Murgent . Damit können Sie sowohl die Größe des Working Sets des Dateisystemcaches als auch die Größe der Standby-Liste in einer detaillierteren und genaueren Ansicht anzeigen. Für Windows XP - Sie benötigen die alte Version 1 von ATM, die zum Download verfügbar ist here , da V2 und V3 Server 2003, Vista oder höher erfordern.
Sie werden feststellen, dass Sysinternals Cacheset zwar den "Cache WS Min" -Zustand verringert, die eigentlichen Daten jedoch weiterhin in Form von Standby-Listen vorhanden sind, von denen sie verwendet werden können, bis sie durch etwas anderes ersetzt werden. Um es dann durch etwas anderes zu ersetzen, verwenden Sie ein Werkzeug wie MemAlloc oder flushmem von Chad Austin oder Consume.exe aus den Windows Server 2003 Resource Kit-Tools .
Ich habe eine Technik gefunden (abgesehen vom Neustart), die scheinbar funktioniert:
Es ist jedoch nicht selektiv. Idealerweise möchte ich in der Lage sein, die spezifischen Speicherbereiche zu löschen, die zum Zwischenspeichern der Plattenblöcke von Dateien verwendet werden, die nicht mehr zwischengespeichert werden sollen.
Es gibt einen Windows-API-Aufruf https://docs.Microsoft.com/en-us/windows/desktop/api/memoryapi/nf-memoryapi-setsystemfilecachesize , mit dem der Dateisystemcache geleert werden kann. Es kann auch verwendet werden, um die Cache-Größe auf einen sehr kleinen Wert zu beschränken. Sieht für diese Art von Tests perfekt aus.