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.
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. –
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