Lassen Sie mich zunächst zugeben, dass ich das Innenleben von Festplatten nicht kenne. Als ich das Handbuch für die Variable innodb_flush_method durchgelesen habe , war ich verwirrt. Kann ich eine Erklärung für Laien zum Unterschied zwischen O_DSYNC und O_DIRECT erhalten und herausfinden, ob es sich um ein Leistungsproblem auf einem Datenbankserver handelt?
Einige Statistiken zu meinem Setup: Mac OSX 10.6 (32-Bit-Kernel, da die Architektur veraltet ist) mit MySQL 5.1.49-64bit (in der Hoffnung, dass ich den Speicher nutzen kann). 8 GB RAM, ~ 6 GB Innodb-Daten / -Indizes.
Antworten:
Hier finden Sie eine Erklärung, wie es
fdatasync()
funktioniert und wie esfsync()
funktioniertfdatasync()
Leert alle Datenpuffer einer Datei auf die Festplatte (bevor der Systemaufruf zurückkehrt). Es ähneltfsync()
, 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 dannfsync()
sofort auf, um sicherzustellen, dass die geschriebenen Daten physisch auf der Festplatte gespeichert sind. Leiderfsync()
werden immer zwei Schreibvorgänge eingeleitetWenn die Änderungszeit nicht Teil des Transaktionskonzepts ist,
fdatasync()
können unnötige Inode-Plattenschreibvorgänge vermieden werden.In Englisch
O_DSYNC
ist es schneller alsO_DIRECT
seit zweimaligemO_DIRECT
Aufrufenfsync()
(eines für Protokolle und eines für Daten) undfsync()
überprüft das Schreiben von Daten über zwei Schreibvorgänge. MitO_DSYNC
Anrufenfdatsync()
undfsync()
. Sie können sich vorstellenfdatasync()
, eine asynchronefsync()
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ährendfsync()
vier Schreiboperationen ausgeführt werden, die anschließend alle überprüft werden.FAZIT
O_DSYNC
O_DIRECT
O_DIRECT
Ich hoffe, diese Antwort hilft, und ich hoffe, ich habe es für Sie nicht noch schlimmer gemacht.
quelle
This means that in principal, fdatasync can execute faster than fsync because it needs to force only one disk write instead of two. However, in current versions of Linux, these two system calls actually do the same thing, both updating the file's modification time.
als ich meinen Beitrag vor 3,5 Jahren schrieb, vor allem mit älteren Linux-Versionen.The related system call fsync() commits just the buffered data relating to a specified file descriptor. fdatasync() is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata.
(Das Wiki wurde zuletzt 28. Juli aktualisiert, 2014).