2015-07-22 32 views
7

Nel mio software sono presenti file 4x 500 GB che scrivo in in sequenza in modo circolare utilizzando le API di file di memoria mappate.Problema di I/O disco con scritture di file circolari

Allocazione regioni in blocchi da 32 MB e quando si alloca un blocco alla fine, creo due regioni mappate in memoria dove il primo è la fine del file e il secondo all'inizio del file e mappato all'indirizzo finale della prima regione.

Ora funziona perfettamente con file più piccoli. Tuttavia, con i file di grandi dimensioni quando si arriva alla fine della regione, le prestazioni del disco vanno a rotoli e non sono sicuro di come evitarlo.

Quello che sto supponendo che stia accadendo è che il disco cerca di scrivere su entrambe le estremità dei file e il mandrino deve saltare avanti e indietro. Il che è una cosa piuttosto stupida da fare, specialmente quando si fanno scritture sequenziali, e avrei sperato che il sistema operativo sarebbe stato un po 'più intelligente.

Qualcuno ha qualche idea su come evitare questo problema?

Stavo pensando di passare a Windows 10 e spero che faccia un lavoro migliore. Ma è un cambiamento piuttosto rischioso che vorrei evitare in questo momento.

Devo anche notare che i file risiedono su un software RAID 1 con 2 unità Seagate Constallation Enterprise da 3 TB. Queste unità hanno una velocità di scrittura sequenziale minima di 60 MB/se una media di 120 MB/s, e sto scrivendo in totale con tutti i file a una velocità di 30 MB/s.

Il codice è here.

EDIT:

Così si scopre, dopo aver scritto per l'intero file e poi a partire dall'esercizio avviare il sistema operativo si avvia in realtà leggendo di nuovo ciò che è sul disco, anche se non è necessario che ciò che credo è la causa i problemi.

+0

come si misura la prestazione del disco e qual è la dimensione del bordo dei file dopo il quale si verifica il problema? –

+0

Attualmente sto testando con file sempre più piccoli. Anche se ci vuole circa un giorno prima che raggiunga la fine. Aggiornerò man mano che otterrò più risultati. – ronag

+0

L'ho misurato dal buffer di scrittura, ho 4 sorgenti a caldo che inviano dati in 4 x 7,5 MB/se ogni buffer di input è bufferizzato. Se il buffer inizia a crescere, significa che il file non viene scritto abbastanza velocemente e quando raggiunge i 4 GB inizia a rilasciare i pacchetti, che è ciò che sta accadendo al momento in cui raggiunge la regione in questione. – ronag

risposta

1

"Queste unità hanno una velocità di scrittura sequenziale minima di 60 MB/s", il che è irrilevante perché non si stanno effettuando scritture sequenziali.

Utilizzare la memorizzazione nella cache SSD o ripensare la progettazione (trovare un modo per impedire l'accesso attraverso il buffer avvolgente).


non inerenti alla Spee: si potrebbe utilizzare un buffer circolare mappato direttamente al file, quindi non c'è bisogno di usare trucchi (proprietario?) Per mappare le regioni di indirizzo "consecutivi". L'idea approssimativa: boost::circular_buffer equivalent for files?

+0

Bene, il modo in cui sto scrivendo in blocchi da 32 MB è praticamente lo stesso di quello sequenziale, il tempo di ricerca sui dischi è di circa 50 ms, il che significa che non c'è nemmeno un sovraccarico teorico dello 0,01%. – ronag

+0

Non posso usare boost :: circular_buffer per diversi motivi, tra l'altro è che non riesco a mappare l'intero file in una volta sola. L'ho provato e la macchina esaurisce la memoria e si blocca. – ronag

+0

Perché no? Il buffer non è stato riparato? Sei in uno spazio di indirizzamento a 16 bit? – sehe