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.
Réponses:
Voici une explication sur comment
fdatasync()
fonctionne vs commentfsync()
fonctionnefdatasync()
vide tous les tampons de données d'un fichier sur le disque (avant le retour de l'appel système). Il ressemblefsync()
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 appellentfsync()
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'écritureSi 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_DSYNC
est plus rapide queO_DIRECT
depuis depuis deuxO_DIRECT
appelsfsync()
(un pour les journaux et un pour les données) etfsync()
vérifie les écritures de données via deux opérations d'écriture. Utiliser lesO_DSYNC
appelsfdatsync()
etfsync()
. Vous pouvez penserfdatasync()
à faire un asynchronefsync()
(ne pas vérifier les données).En regardant les chiffres,
O_DSYNC
quatre opérations d'écriture sont effectuées, dont deux sont vérifiées, tandisfsync()
que quatre opérations d'écriture sont vérifiées par la suite.CONCLUSION
O_DSYNC
O_DIRECT
O_DIRECT
J'espère que cette réponse vous aidera et j'espère que je n'ai pas aggravé les choses pour vous.
la source
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.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).