Avec les disques durs actuels, il n'y a pas l'assurance qu'un fichier est réellement écrit sur le disque même si le disque signale l'écriture comme terminée au système d'exploitation ! Cela est dû au cache intégré dans le lecteur.
Sur freeBSD, vous pouvez désactiver cela en définissant le kern.cam.ada.write_cache
sysctl à 0. Cela va dégrader les performances d'écriture de manière significative . La dernière fois que je l'ai mesuré (disque dur WDC WD5001ABYS-01YNA0 sur un chipset ICH-7, FreeBSD 8.1 AMD64), performances en écriture continue (mesurées avec dd if=/dev/zero of=/tmp/foo bs=10M count=1000
) est passé de 75 000 000 octets/s à 12 900 000 octets/s.
Si vous voulez être absolument sûr que vos fichiers sont écrits ;
- Désactiver la mise en cache en écriture avec
sysctl kern.cam.ada.write_cache=0
suivi decamcontrol reset <bus>:<target>:<lun>
. - Ouvrir le fichier avec le
O_SYNC
option.
Remarque :
- Vos performances d'écriture (sur un disque dur) vont maintenant être absolument nulles.
- Ne montez pas la partition avec le
sync
option; qui causera tous Les E/S (y compris les lectures) doivent être effectuées de manière synchrone. - Ne pas utiliser
O_DIRECT
. Il essaiera de contourner complètement le cache. Cela influencera probablement aussi les lectures.
O_DIRECT
existe essentiellement uniquement pour qu'Oracle contourne la couche de cache tampon du noyau et fasse sa propre mise en cache. Il a une sémantique mal définie, des limitations arbitraires sur la taille et l'alignement des lectures que vous pouvez effectuer, et ne doit généralement pas être utilisé. O_SYNC
est censé vous donner les effets que vous souhaitez, mais sans un système de fichiers sous-jacent résistant aux pannes de courant ou aux plantages, il pourrait ne pas suffire à vos besoins.