2015-09-23 16 views
7

Background:C Disk I/O - scrivere dopo aver letto alla stessa di offset di un file vi farò leggere il throughput molto basso

sto sviluppando un programma relativo banca dati, e ho bisogno di irrigare i metadati sporca memoria su disco sequenzialmente. /dev/sda1 è in formato volumn, quindi i dati su/dev/sda1 saranno accessibili blocco per blocco ei blocchi sono fisicamente adiacenti se vi si accede sequenzialmente. E utilizzo l'I/O diretto, quindi l'I/O ignorerà il meccanismo di memorizzazione nella cache del file system e accederà direttamente ai blocchi sul disco.

Problemi:

Dopo l'apertura/dev/sda1, lo leggerò un isolato, aggiornare il blocco e scrivere il blocco di nuovo allo stesso offset dall'inizio di/dev/sda1, in modo iterativo.

Il codice sono come qui sotto -

//block_size = 256KB 
int file = open("/dev/sda1", O_RDWR|O_LARGEFILE|O_DIRECT); 
for(int i=0; i<N; i++) { 
    pread(file, buffer, block_size, i*block_size); 
    // Update the buffer 
    pwrite(file, buffer, block_size, i*block_size); 
} 

ho scoperto che se non faccio pwrite, leggere il throughput è 125 MB/s.

Se lo faccio pwrite, leggere il throughput sarà 21 MB/s, e scrivere il throughput è 169 MB/s.

Se faccio pread dopo pwrite, scrivere il throughput è 115 MB/s, e leggere il throughput è 208 MB/s.

Ho anche provato read()/write() e aio_read()/aio_write(), ma il problema rimane. Non so perché scrivere dopo aver letto nella stessa posizione di un file renderà il throughput di lettura così basso.

Se si accede più blocchi in un momento, come questo

pread(file, buffer, num_blocks * block_size, i*block_size); 

Il problema mitigherà, si prega di vedere il chart.

+1

Qual è la dimensione del tuo blocco? C'è una buona probabilità che tu stia vedendo gli effetti del caching dell'hardware e del read-ahead sui dischi a cui stai accedendo. Il 'pwrite()' riempie la cache, e se il prossimo 'pread()' è per dati diversi, nessuno di questi viene memorizzato nella cache. Facendo il 'pread()' dopo 'pwrite()' consente di leggere i dati direttamente dalla cache hardware del disco. –

+0

Non conosco la dimensione fisica del blocco e ho impostato su 256 KB nel programma. Grazie per il tuo commento, ora penso che sia molto probabilmente causato dal buffer del disco. – Leo

risposta

2

E io uso I/O diretto, in modo che il I/O bypassare il meccanismo di caching del file system e accedere direttamente ai blocchi sul disco.

Se non si dispone di un file system sul dispositivo e si utilizza direttamente il dispositivo per leggere/scrivere, non è presente alcuna cache del file system nell'immagine.

Il comportamento osservato è tipico dell'accesso al disco e del comportamento IO.

ho scoperto che se non faccio pwrite, throughput in lettura è di 125 MB/s

Motivo: Il disco appena legge i dati, che non ha bisogno di tornare al offset e scrivere dati, 1 operazione in meno.

Se lo faccio pwrite, leggere il throughput sarà di 21 MB/s, e scrivere il throughput è di 169 MB/s.

Motivo: il disco potrebbe avere una velocità di scrittura migliore, probabilmente il buffer del disco memorizza nella cache anziché colpire direttamente il supporto.

Se eseguo il pread dopo il pwrite, il throughput di scrittura è di 115 MB/s e la velocità di lettura è di 208 MB/s.

Motivo: molto probabilmente i dati scritti vengono memorizzati nella cache a livello del disco e quindi letti i dati dalla cache anziché dai supporti.

Per ottenere prestazioni ottimali, è necessario utilizzare IO asincroni e numero di blocchi alla volta. Tuttavia, è necessario utilizzare un numero ragionevole di blocchi e non è possibile utilizzare un numero molto elevato. Dovrebbe scoprire cosa è ottimale per tentativi ed errori.

+0

Grazie per la risposta, ora penso che sia molto probabilmente causato dal buffer del disco. Ma non riesco ancora a immaginare che solo cercare la posizione precedente consentirà di leggere il throughput da 125 MB/s a ​​21 MB/s ... – Leo

+0

@leo, Sì, le ricerche sono costose. Guarda i tempi di attesa di I/O che aumenterebbero quando la produttività diminuisse. – Rohan

Problemi correlati