Clarification sur la variable MySQL innodb_flush_method

21

Permettez-moi de commencer par admettre que je suis très ignorant du fonctionnement interne des disques durs. Donc, quand j'ai relu le manuel de la variable innodb_flush_method , cela m'a dérouté. Puis-je obtenir une explication en termes simples sur la différence entre O_DSYNC et O_DIRECT, et comment savoir s'il s'agit d'un problème de performances sur un serveur de base de données.

Quelques statistiques sur ma configuration: Mac OSX 10.6 (noyau 32 bits, puisque l'architecture est obsolète) exécutant MySQL 5.1.49-64bit (en espérant que cela me permettrait d'utiliser la mémoire). 8 Go de RAM, ~ 6 Go de données / index innodb.

Derek Downey
la source
2
Je ne sais pas si Mac OS X prend en charge une option IO directe appropriée - je ne pensais pas que c'était le cas. Vous êtes la deuxième personne que j'ai vue aujourd'hui devenir confuse par cette page de manuel. J'ai un bug ouvert dessus: bugs.mysql.com/bug.php?id=54306
Morgan Tocker

Réponses:

16

Voici une explication sur comment fdatasync()fonctionne vs comment fsync()fonctionne

fdatasync()vide tous les tampons de données d'un fichier sur le disque (avant le retour de l'appel système). Il ressemble fsync()mais n'est pas requis pour mettre à jour les métadonnées, telles que le temps d'accès. Les applications qui accèdent aux bases de données ou aux fichiers journaux écrivent souvent un petit fragment de données (par exemple, une ligne dans un fichier journal), puis appellent fsync()immédiatement afin de s'assurer que les données écrites sont physiquement stockées sur le disque dur. Malheureusement, fsync()lancera toujours deux opérations d'écriture

  • une opération d'écriture pour les données nouvellement écrites
  • une opération d'écriture pour mettre à jour le temps de modification stocké dans l'inode

Si le temps de modification ne fait pas partie du concept de transaction, il fdatasync()peut être utilisé pour éviter des opérations d'écriture inutiles sur disque inode.

En anglais, O_DSYNCest plus rapide que O_DIRECTdepuis depuis deux O_DIRECTappels fsync()(un pour les journaux et un pour les données) et fsync()vérifie les écritures de données via deux opérations d'écriture. Utiliser les O_DSYNCappels fdatsync()et fsync(). Vous pouvez penser fdatasync()à faire un asynchrone fsync()(ne pas vérifier les données).

En regardant les chiffres, O_DSYNCquatre opérations d'écriture sont effectuées, dont deux sont vérifiées, tandis fsync()que quatre opérations d'écriture sont vérifiées par la suite.

CONCLUSION

  • O_DSYNC
    • plus rapide que O_DIRECT
    • Les données peuvent / peuvent ne pas être cohérentes en raison de la latence ou d'un crash pur et simple
  • O_DIRECT
    • plus stable
    • cohérence des données
    • naturellement plus lent

J'espère que cette réponse vous aidera et j'espère que je n'ai pas aggravé les choses pour vous.

RolandoMySQLDBA
la source
2
À noter: O_DIRECT n'est utilisé que sur les fichiers d'espace table, pas sur les journaux. Aussi - si O_DIRECT va être utile ou non dépend du matériel. J'ai lié à un bogue de documentation ouvert en tant que commentaire à la question de l'auteur.
Morgan Tocker
Merci d'avoir clarifié cela, Morgan. Je vais corriger ça.
RolandoMySQLDBA
O_DSYNC est une écriture synchrone, comment pouvez-vous conclure qu'il est plus rapide qu'asynchrone + fsync?
noonex
@noonex fdatasync () est synchrone pour ses données, pas pour ses métadonnées. Selon informit.com/articles/article.aspx?p=23618&seqNum=5 , 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.au moment où j'ai écrit mon article il y a 3,5 ans, c'était vrai, en particulier avec les anciennes versions de Linux.
RolandoMySQLDBA
@noonex Selon 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.(Ce Wiki a été mis à jour pour la dernière fois le 28 juillet 2014).
RolandoMySQLDBA