2012-01-09 3 views
5

Sto lavorando su un'applicazione nativa C++/Win32/MFC su Windows 7. Sto utilizzando CFile per aprire un file memorizzato su un server remoto (con i flag, CFile :: modeRead | CFile :: shareDenyWrite). Il server esegue Windows Server 2008 e sto accedendo al file su un'unità condivisa tramite la normale condivisione dei file di Windows. Una volta aperto il file, lo leggerò come descritto di seguito.prestazioni quando si accede a un file su un server di rete in sequenza dopo averlo acceduto in modo casuale

In primo luogo, sto cercando di più posizioni nel file (10 posizioni) e la lettura di piccole sezioni (128 byte). Quindi, cerco l'inizio e la lettura sequenzialmente attraverso l'intero file.

Quello che ho notato è che fare quanto sopra è stato MOLTO più lento del semplice aprire il file e leggerlo. Le ricerche e campionature casuali iniziali sono molto veloci, quasi istantanee anche con un file di grandi dimensioni. La cosa interessante è che anche se questo è veloce, nella parte successiva, la scansione del file è molto lenta se confrontata con la semplice scansione senza l'accesso casuale iniziale.

Nel tentativo di capire cosa stava succedendo ho tirato su il monitor delle prestazioni e guardato il traffico di rete. Se faccio solo la lettura sequenziale del file, sto scaricando da 3,5 MB/s tramite l'adattatore wireless. Se prima cerco in giro in modo casuale, poi leggo sequenzialmente sto ottenendo solo 300kB/s durante la lettura sequenziale.

La soluzione era chiudere e riaprire il file dopo aver eseguito la parte di accesso casuale. Quando l'ho fatto, la lettura sequenziale ha accelerato.

Quindi sembra che fare le letture di accesso casuale (ricerca e lettura) abbia fatto qualcosa sul server che ha causato la lettura sequenziale di essere lento. Mi chiedo, qualcuno sa per certo che cosa sta succedendo qui e qual è la vera causa del comportamento che sto vedendo? Anche se ho una soluzione per questo mi piacerebbe capire meglio cosa sta succedendo sotto il cofano per causare questo.

+2

Puramente speculazione, potrebbe essere possibile che Windows abbia realizzato che il file è stato utilizzato per l'accesso casuale, e quindi disabilitato il precaricamento delle pagine sequenziali del file? Ne dubito comunque. –

risposta

6

Il commento di Mooing Duck è corretto. Il sistema operativo inizia assumendo l'accesso sequenziale come un'opzione 'soft' - abilitata fino a prova dannosa. Ma gli accessi casuali fanno sì che la lettura in anticipo peggiori le prestazioni e il comportamento di caching "intelligente" gira in avanti.

Si potrebbe pensare che alcuni accessi sequenziali causerebbero il riavvio di Windows. Ma sfortunatamente, la bandiera non è più "morbida" a questo punto. Windows considera da allora in poi l'accesso casuale, proprio come se fosse stato forzato in quella modalità.

È possibile passare CreateFile l'opzione FILE_FLAG_SEQUENTIAL_SCAN per forzarla a continuare a leggere in anticipo a prescindere da cosa. Ma la tua soluzione riaperta è probabilmente più valida di qualsiasi altra cosa. Ed è l'unico modo se non si chiama direttamente CreateFile.

+0

fantastico! Grazie! Sono contento di capire che cosa sta andando un po 'meglio ora. – Nerdtron

+0

+1, buono a sapersi. – lapk

+1

Mi chiedo se l'utilizzo della flag "scansione sequenziale" possa rallentare la parte di accesso casuale. – Nerdtron