Con gli hard disk attuali, no garanzia che un file sia effettivamente scritto su disco anche se il disco riporta la scrittura come completa al sistema operativo! Ciò è dovuto alla cache integrata nell'unità.
Su freeBSD puoi disabilitarlo impostando kern.cam.ada.write_cache
sysctl a 0. Questo degraderà scrivere le prestazioni in modo significativo . L'ultima volta che l'ho misurato (disco rigido WDC WD5001ABYS-01YNA0 su un chipset ICH-7, FreeBSD 8.1 AMD64), prestazioni di scrittura continua (misurate con dd if=/dev/zero of=/tmp/foo bs=10M count=1000
) è sceso da 75.000.000 byte/sec a 12.900.000 byte/sec.
Se vuoi essere assolutamente sicuro che i tuoi file siano scritti;
- Disabilita la cache in scrittura con
sysctl kern.cam.ada.write_cache=0
seguito dacamcontrol reset <bus>:<target>:<lun>
. - Apri il file con
O_SYNC
opzione.
Nota:
- Le tue prestazioni di scrittura (su un HDD) ora faranno assolutamente schifo.
- Non montare la partizione con
sync
opzione; questo causerà tutto I/O (incluse le letture) da eseguire in modo sincrono. - Non utilizzare
O_DIRECT
. Proverà a bypassare del tutto la cache. Questo probabilmente influenzerà anche le letture.
O_DIRECT
fondamentalmente esiste solo per Oracle per bypassare il livello della cache del buffer del kernel e fare il proprio caching. Ha una semantica mal definita, limitazioni arbitrarie sulla dimensione e l'allineamento delle letture che è possibile eseguire e generalmente non dovrebbe essere utilizzato. O_SYNC
dovrebbe darti gli effetti che desideri, ma senza un filesystem sottostante che sia robusto contro interruzioni di corrente o arresti anomali, potrebbe comunque non essere sufficiente per le tue esigenze.