2010-07-18 14 views
6

Eventuali duplicati:
How to invalidate the file system cache?Come posso forzare Windows a cancellare tutti i dati della cache di lettura del disco?

Sto scrivendo un programma Win32 intensivo del disco. La prima volta che viene eseguito, viene eseguito molto più lentamente mentre esegue la scansione delle cartelle dell'utente utilizzando FindFirstFile()/FindNextFile().

Come posso ripetere questa prima prestazione senza riavvio? C'è un modo per forzare il sistema a scartare tutto nella sua cache del disco?

So che se dovessi leggere un singolo file, posso disabilitare il caching passando il flag FILE_FLAG_NO_BUFFERING a una chiamata a CreateFile(). Ma non sembra possibile farlo durante la ricerca di file.

+1

+1 stavo girando per pubblicare un post correlato me stesso. Quando si tenta di elaborare le prestazioni degli algoritmi relativi al disco, il caching si mette davvero in mezzo. Buona domanda. –

risposta

0

Ho provato tutti i metodi nelle risposte, incluso CacheSet, ma non avrebbero funzionato con FindFirstFile/FindNextfile(). Ecco cosa ha funzionato:

  • Scansione di file sulla rete. Durante la scansione di un'unità condivisa, sembra che Windows non memorizzi le cartelle nella cache, quindi è lento ogni volta.

  • Il modo più semplice per rendere più lento qualsiasi algoritmo è l'inserimento di chiamate su Sleep(). Questo può rivelare molti problemi nel codice multi-threaded, ed è quello che stavo davvero cercando di fare.

+1

Per notare, il client SMB di Windows e il server SMB di Windows hanno le proprie cache di cui si ha quindi a che fare (e HDD e altre cache, livello SAN, controller RAID ...). La soluzione migliore, dato che la magia di CacheSet non funziona (sono d'accordo), è quella di "riempire la cache" in modo da eliminare le voci precedenti. Ciò vuol dire che è necessario calcolare la dimensione di tutte le cache coinvolte e riempirle in modo che i dati precedentemente letti/scritti vengano espulsi (o scaricati in una memoria stabile). vedi HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ lanmanserver \ parametri reg_dword: TreatHostAsStableStorage. – mbrownnyc

0

È possibile evitare un riavvio fisico utilizzando una macchina virtuale.

+1

Questo non funziona. Il sistema operativo host finisce per fare anche il caching, il che rende i test inaccurati. –

1

È necessario creare una pressione di memoria sufficiente a far sì che gestore della memoria e gestore cache scarti i risultati delle cache in precedenza. Per il gestore cache, è possibile provare ad aprire un file di grandi dimensioni (ad esempio Bigger than physical ram) con la memorizzazione nella cache abilitata e quindi leggerlo all'indietro (per evitare eventuali ottimizzazioni I/O sequenziali). Le interazioni tra vm e cache manager sono un po 'più complesse e molto più dipendenti dalla versione os.

Ci sono anche cache sul controller (possibilmente, ma improbabile) e sul disco stesso (probabile). Ci sono specifici IoCtl per svuotare questa cache, ma nella mia esperienza, il firmware del disco non è stato testato in questa arena.

+0

Questo è esattamente quello che ho sempre fatto. Un modo semplice è aprire un file di grandi dimensioni e cercare una sequenza di byte che non esiste nel file. Windows invaderà la cache con il nuovo file e invierà i vecchi dati. Non è l'ideale, ma funziona. – Synetech

3

Avete mai pensato di farlo su un altro volume e di smontare/rimontare il volume? Ciò causerà la grande maggioranza di tutto da rileggere dal disco (anche se la cache non ci mancherà).

+0

+1: questo è l'unico approccio che sarà coerente. –

1

Verificare la funzione Cancella di CacheSet da SysInternals.

+0

L'ho provato su Windows XP e l'enumerazione tramite le cartelle del disco era altrettanto veloce dopo aver svuotato la cache come prima, quindi sembrava non funzionare. –

Problemi correlati