Hier finden Sie eine Erklärung, wie es fdatasync()
funktioniert und wie es fsync()
funktioniert
fdatasync()
Leert alle Datenpuffer einer Datei auf die Festplatte (bevor der Systemaufruf zurückkehrt). Es ähnelt fsync()
, ist jedoch nicht erforderlich, um die Metadaten wie die Zugriffszeit zu aktualisieren. Anwendungen, die auf Datenbanken oder Protokolldateien zugreifen, schreiben häufig ein winziges Datenfragment (z. B. eine Zeile in einer Protokolldatei) und rufen dann fsync()
sofort auf, um sicherzustellen, dass die geschriebenen Daten physisch auf der Festplatte gespeichert sind. Leider fsync()
werden immer zwei Schreibvorgänge eingeleitet
- eine Schreiboperation für die neu geschriebenen Daten
- eine Schreiboperation, um die in der Inode gespeicherte Änderungszeit zu aktualisieren
Wenn die Änderungszeit nicht Teil des Transaktionskonzepts ist, fdatasync()
können unnötige Inode-Plattenschreibvorgänge vermieden werden.
In Englisch O_DSYNC
ist es schneller als O_DIRECT
seit zweimaligem O_DIRECT
Aufrufen fsync()
(eines für Protokolle und eines für Daten) und fsync()
überprüft das Schreiben von Daten über zwei Schreibvorgänge. Mit O_DSYNC
Anrufen fdatsync()
und fsync()
. Sie können sich vorstellen fdatasync()
, eine asynchrone fsync()
Operation durchzuführen (keine Überprüfung der Daten).
Beim Betrachten der Zahlen werden O_DSYNC
vier Schreiboperationen ausgeführt, von denen zwei überprüft werden, während fsync()
vier Schreiboperationen ausgeführt werden, die anschließend alle überprüft werden.
FAZIT
O_DSYNC
- schneller als
O_DIRECT
- Die Daten sind möglicherweise aufgrund von Latenz oder einem Absturz nicht konsistent
O_DIRECT
- stabiler
- Daten konsistent
- natürlich langsamer
Ich hoffe, diese Antwort hilft, und ich hoffe, ich habe es für Sie nicht noch schlimmer gemacht.