Erläuterung zur MySQL-Variablen innodb_flush_method

21

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.

Derek Downey
quelle
2
Ich weiß nicht, ob Mac OS X eine richtige direkte E / A-Option unterstützt - ich hätte nicht gedacht, dass dies der Fall ist. Du bist die zweite Person, die ich heute gesehen habe, die durch diese Handbuchseite verwirrt wird. Ich habe hier einen offenen Bug: bugs.mysql.com/bug.php?id=54306
Morgan Tocker

Antworten:

16

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_DSYNCist es schneller als O_DIRECTseit zweimaligem O_DIRECTAufrufen fsync()(eines für Protokolle und eines für Daten) und fsync()überprüft das Schreiben von Daten über zwei Schreibvorgänge. Mit O_DSYNCAnrufen 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_DSYNCvier 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.

RolandoMySQLDBA
quelle
2
Es sei darauf hingewiesen, dass O_DIRECT nur für die Tabellenbereichsdateien verwendet wird, nicht für die Protokolle. Auch - ob O_DIRECT nützlich sein wird oder nicht, hängt von der Hardware ab. Ich habe einen offenen Dokumentationsfehler als Kommentar zur Frage des Autors verlinkt.
Morgan Tocker
Danke, dass Sie das klargestellt haben, Morgan. Ich werde das korrigieren.
RolandoMySQLDBA
O_DSYNC ist synchrones Schreiben. Wie können Sie daraus schließen, dass es schneller ist als asynchron + fsync?
noonex
@noonex fdatasync () ist für seine Daten synchron, nicht für seine Metadaten. Laut informit.com/articles/article.aspx?p=23618&seqNum=5 stimmte dies , 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.
RolandoMySQLDBA
@noonex Nach en.wikipedia.org/wiki/Sync_(Unix) , 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).
RolandoMySQLDBA