Svuota la cache dei file per ripetere i test delle prestazioni


106

Quali strumenti o tecniche posso utilizzare per rimuovere il contenuto dei file memorizzati nella cache per evitare che i risultati delle mie prestazioni vengano distorti? Credo di aver bisogno di cancellare completamente o rimuovere selettivamente le informazioni memorizzate nella cache sul contenuto di file e directory.

L'applicazione che sto sviluppando è un'utilità di compressione specializzata e si prevede che svolga molto lavoro leggendo e scrivendo file che il sistema operativo non ha toccato di recente e di cui è improbabile che i blocchi del disco vengano memorizzati nella cache.

Desidero rimuovere la variabilità che vedo nel tempo di IO quando ripeto il compito di profilare strategie diverse per eseguire il lavoro di elaborazione dei file.

Sono principalmente interessato alle soluzioni per Windows XP, in quanto questa è la mia macchina di sviluppo principale, ma posso anche testare usando Linux, quindi sono interessato anche alle risposte per quell'ambiente.

Ho provato SysInternals CacheSet , ma facendo clic su "Cancella" non si ottiene un aumento misurabile (ripristino del tempo dopo un avvio a freddo) nel tempo necessario per rileggere i file che ho letto poche volte.



1
Perché questa domanda è stata eliminata ?
Dan Dascalescu

Risposte:


82

Usa l' app RAMMap di SysInternal .

rammap vuoto standby

L'opzione di menu Elenco standby vuoto / vuoto cancellerà la cache dei file di Windows.


2
RAMMap non funziona su Windows XP. Queste opzioni di menu fanno qualcosa di diverso dal pulsante "Cancella" nell'applicazione SysInternals Cacheset?
Stephen Denne

@stephen questa tecnica ha funzionato perfettamente per me sotto Windows 8! Windows XP ha 12 anni ormai, c'è qualche motivo per cui non puoi provarlo su Vista, Windows 7 o Windows 8?
Jeff Atwood

@ Jeff non lavoro più con queste limitazioni. Quindi "Empty Standby List" risulta nella lettura successiva da un file letto di recente che richiede l'IO del disco?
Stephen Denne

2
Premere F5 per aggiornare l'elenco dei file dopo aver fatto clic su elenco standby vuoto
JoshG

3
Per un approccio programmatico, vedi questo post SO: stackoverflow.com/a/23085045/430360
snemarch

16

Per Windows XP, dovresti essere in grado di svuotare la cache per un file specifico aprendo il file utilizzando CreateFile con le opzioni FILE_FLAG_NO_BUFFERING e quindi chiudendo l'handle. Questo non è documentato e non so se funziona sulle versioni successive di Windows, ma l'ho usato molto tempo fa durante la scrittura del codice di prova per confrontare le librerie di compressione dei file. Non ricordo se l'accesso in lettura o scrittura abbia influito su questo trucco.


Funziona perfettamente per me con Windows 7 SP1, x64. Ottimo suggerimento!
cxxl

2
Quindi deve essere ripetuto per ogni file ? Quindi, se, ad esempio, copi una directory contenente 100 MB distribuiti su 30 file in 10 sottodirectory, devi aprirli separatamente per assicurarti di leggere il disco effettivo anziché la cache?
Synetech

Altre risposte sul sito affermano che funziona anche in Win7 e 8. Presumo che funzioni su Vista. E sì, devi eseguirlo su ogni file, ma non ci vuole così tanto tempo. Tutto quello che devi fare è aprire e chiudere ogni file e, quando lo chiudi, Windows cancella la cache. Dopo averlo fatto, POI esegui il test delle prestazioni.
Mooing Duck

1
Questa è stata una risposta perfetta. Semplice da codificare, efficace e dovrebbe funzionare sulla maggior parte dei sistemi operativi Windows (incluso XP, l'ho testato solo su Win7x64). Ho aperto i file con privilegi di lettura e nessuna condivisione. Non sono sicuro di cosa sia importante la combo.
Rosco

Funzionalità simile su Linux (2.4.10 in poi) con il flag O_DIRECT nella syscall aperta (2). Bene, più precisamente, da quello che ho capito, O_DIRECT non cancella la cache per quel file, cerca di bypassarlo.
kaiwan

14

Una rapida ricerca su Google fornisce queste opzioni per Linux

  1. Smonta e monta la partizione che contiene i file
  2. sync && echo 1 > /proc/sys/vm/drop_caches

2
Grazie, sembra molto utile, anche se forse vorrei fare l'eco di 3 invece di 1. Sono principalmente interessato a Windows XP, motivo per cui non l'avevo trovato nel mio googling.
Stephen Denne

Sfortunatamente l'ambiente Linux in cui potrei farne uso ha la versione del kernel 2.6.9. drop_caches è stato aggiunto nel kernel 2.6.16
Stephen Denne

Molti altri post che ho letto suggeriscono che puoi smontare e montare il filesystem per rimuovere tutti gli elementi screpolati, presumo che fosse il caso prima della 2.6.16 così come nei kernel più recenti.
TafT

12

Un'utilità della riga di comando può essere trovata qui

dalla fonte:

EmptyStandbyList.exe è uno strumento da riga di comando per Windows (Vista e versioni successive) che può svuotare:

  • set di lavoro di processo,
  • l'elenco delle pagine modificate,
  • le liste di attesa (priorità da 0 a 7), o
  • solo l'elenco di standby con priorità 0.

Uso:

EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist

3
Risposta altamente sottovalutata in mezzo a tutto il rumore, semplice utilità che fa un lavoro e lo fa bene. Probabilmente dovresti includere più dettagli nella risposta per ottenere i voti che meriti.
Prometeo


3

Ho trovato una tecnica (diversa dal riavvio) che sembra funzionare:

  1. Esegui alcune copie di MemAlloc
  2. Con ognuno, allocare grossi blocchi di memoria alcune volte
  3. Utilizzare Process Explorer per osservare la riduzione delle dimensioni della cache di sistema a livelli molto bassi
  4. Chiudere i programmi MemAlloc

Tuttavia non è selettivo. Idealmente mi piacerebbe essere in grado di cancellare le porzioni specifiche di memoria utilizzate per la memorizzazione nella cache dei blocchi del disco dei file che non voglio più essere memorizzati nella cache.


Questo ha l'effetto collaterale di inserire cose nel file di paging che ucciderà le prestazioni per un bel po 'di tempo dopo. Se stai per ricorrere a un kludge, puoi anche leggere qualche altro file di grandi dimensioni; almeno questo cancella solo la cache del disco e nient'altro.
Synetech

3

Per una migliore visualizzazione della cache del filesystem di Windows XP - prova ATM di Tim Murgent - ti permette di vedere sia la dimensione del Working Set della cache del filesystem che la dimensione dell'elenco di standby in una vista più dettagliata e accurata. Per Windows XP: è necessaria la vecchia versione 1 di ATM, disponibile per il download qui poiché V2 e V3 richiedono Server 2003, Vista o versioni successive.

Si osserverà che sebbene Sysinternals Cacheset ridurrà "Cache WS Min", i dati effettivi continuano ad esistere sotto forma di elenchi di standby da cui possono essere utilizzati fino a quando non vengono sostituiti con qualcos'altro. Per poi sostituirlo con qualcos'altro utilizzare uno strumento come MemAlloc o flushmem di Chad Austin o Consume.exe dagli strumenti del Resource Kit di Windows Server 2003 .


0

Dato che la questione ha chiesto anche per Linux, c'è una risposta correlata qui .

Lo strumento della riga di comando vmtouch consente di aggiungere e rimuovere file e directory dalla cache dei file di sistema, tra le altre cose.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.