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.
come si misura la prestazione del disco e qual è la dimensione del bordo dei file dopo il quale si verifica il problema? –
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
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