2013-10-18 7 views
5

Sto scrivendo un programma che gira sia su Linux che su FreeBSD, e voglio assicurarmi che i dati siano effettivamente scritti sul file sul dispositivo fisico quando ogni write() restituisce, quindi che i miei dati non si perderanno per caso (ad esempio, perdita di alimentazione, interruzione del processo inaspettata, ecc.).O_DIRECT vs. O_SYNC su Linux/FreeBSD

Secondo la pagina man OPEN (2), su Linux (superiore a 2.6), O_DIRECT è sincrono ma potrebbe presentare problemi di prestazioni; su FreeBSD, O_DIRECT non è garantito sincrono e potrebbe anche presentare problemi.

Quindi, su Linux, sia O_DIRECT o O_SYNC garantisce la scrittura sincrona, ma quale ha prestazioni migliori?

In FreeBSD, per garantire scrittura sincrona, quale opzione ha le migliori prestazioni: (1) O_DIRECT + fsync() (2) O_DIRECT | O_SYNC o (3) da solo O_SYNC?

+0

Penso che non si possa paragonarli affatto, dal momento che sono fondamentalmente cose diverse (anche se sembrano "fare qualcosa di simile"). – Damon

risposta

5

Con i dischi rigidi attuali, c'è no la garanzia che un file viene effettivamente scritto sul disco anche se il disco riporta la scrittura come completa per il sistema operativo! Ciò è dovuto alla cache integrata nell'unità.

su FreeBSD è possibile disattivare questa impostando la kern.cam.ada.write_cache sysctl a 0. Questa sarà degradare le prestazioni di scritturasignificativamente. L'ultima volta che l'ho misurato (disco rigido WDC WD5001ABYS-01YNA0 su un chipset ICH-7, FreeBSD 8.1 AMD64), le prestazioni di scrittura continua (misurate con dd if=/dev/zero of=/tmp/foo bs=10M count=1000) sono scese da 75.000.000 byte/sec a 12.900.000 byte/sec.

Se si vuole essere assolutamente sicuri che i propri file siano scritti;

  • Disabilitare la cache di scrittura con sysctl kern.cam.ada.write_cache=0 seguito da camcontrol reset <bus>:<target>:<lun>.
  • Aprire il file con l'opzione O_SYNC.

Nota:

  • tua perfomance di scrittura (su un HDD) ora assolutamente succhiare.
  • Non montare la partizione con l'opzione sync; quello causerà tutto l'I/O (incluso le letture) per essere fatto sincronicamente.
  • Non utilizzare O_DIRECT. Cercherà di bypassare del tutto la cache. Questo probabilmente influenzerà anche le letture.
3

O_DIRECT fondamentalmente esiste solo per Oracle per bypassare il livello di cache del buffer del kernel e fare il proprio caching. Ha una semantica mal definita, limitazioni arbitrarie sulle dimensioni e l'allineamento delle letture che è possibile eseguire e in generale non dovrebbe essere usato. O_SYNC dovrebbe fornire gli effetti desiderati, ma senza un file system sottostante che sia efficace contro interruzioni di corrente o arresti anomali, potrebbe non essere sufficiente per le tue esigenze.

+0

Grazie. Per quanto riguarda le prestazioni, qual'è il rendimento migliore, O_DIRECT o O_SYNC? –

+0

A meno che non si scriva il proprio livello di cache (e probabilmente anche allora), 'O_DIRECT' ha prestazioni pessime dal momento che rileggerà dal disco ogni volta. –