Chiarimento sulla variabile MySQL innodb_flush_method


21

Vorrei iniziare ammettendo che ignoro molto il funzionamento interno dei dischi rigidi. Quindi, quando ho letto il manuale della variabile innodb_flush_method , mi ha confuso. Posso ottenere una spiegazione in parole povere sulla differenza tra O_DSYNC e O_DIRECT e come sapere se si tratta di un problema di prestazioni su un server di database.

Alcune statistiche sulla mia configurazione: Mac OSX 10.6 (kernel a 32 bit, poiché l'architettura non è aggiornata) con MySQL 5.1.49-64 bit (sperando che mi permettesse di usare la memoria). 8 GB di RAM, ~ 6 GB di dati / indici innodb.


2
Non so se Mac OS X supporta un'opzione IO diretta corretta - non pensavo che fosse così. Sei la seconda persona che ho visto oggi confuso da quella pagina di manuale. Ho un bug aperto qui: bugs.mysql.com/bug.php?id=54306
Morgan Tocker

Risposte:


16

Ecco una spiegazione su come fdatasync()funziona vs come fsync()funziona

fdatasync()scarica tutti i buffer di dati di un file su disco (prima che la chiamata di sistema ritorni). È simile fsync()ma non è necessario per aggiornare i metadati, come il tempo di accesso. Le applicazioni che accedono a database o file di registro spesso scrivono un piccolo frammento di dati (ad esempio una riga in un file di registro) e quindi chiamano fsync()immediatamente per garantire che i dati scritti siano fisicamente memorizzati sul disco rigido. Sfortunatamente, fsync()avvieranno sempre due operazioni di scrittura

  • un'operazione di scrittura per i dati appena scritti
  • una sola operazione di scrittura per aggiornare il tempo di modifica memorizzato nell'inode

Se il tempo di modifica non fa parte del concetto di transazione, è fdatasync()possibile utilizzarlo per evitare operazioni di scrittura su disco inode non necessarie.

In inglese, O_DSYNCè più veloce rispetto a O_DIRECTquando O_DIRECTchiama fsync()due volte (una per i registri e una per i dati) e fsync()verifica le scritture dei dati tramite due operazioni di scrittura. Usando le O_DSYNCchiamate fdatsync()e fsync(). Puoi pensare di fdatasync()fare un asincrono fsync()(non verificare i dati).

Guardando i numeri, O_DSYNCesegue quattro operazioni di scrittura, due delle quali sono verificate, mentre fsync()quattro operazioni di scrittura, tutte verificate in seguito.

CONCLUSIONE

  • O_DSYNC
    • più veloce di O_DIRECT
    • I dati potrebbero / potrebbero non essere coerenti a causa della latenza o di un arresto anomalo
  • O_DIRECT
    • più stabile
    • dati coerenti
    • naturalmente più lento

Spero che questa risposta ti aiuti, e spero di non aver peggiorato le cose per te.


2
Vale la pena sottolineare: O_DIRECT viene utilizzato solo sui file del tablespace, non sui registri. Inoltre, se O_DIRECT sarà utile o meno dipende dall'hardware. Mi sono collegato a un bug di documentazione aperto come commento alla domanda dell'autore.
Morgan Tocker,

Grazie per averlo chiarito, Morgan. Lo correggerò.
RolandoMySQLDBA

O_DSYNC è la scrittura sincrona, come puoi concludere che è più veloce di asincrono + fsync?
Noonex,

@noonex fdatasync () è sincrono per i suoi dati, non per i suoi metadati. Secondo 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.All'epoca in cui ho scritto il mio post 3,5 anni fa, era vero, specialmente con le versioni precedenti di Linux.
RolandoMySQLDBA

@noonex Secondo 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.(che Wiki è stato aggiornato l'ultima volta il 28 luglio 2014).
RolandoMySQLDBA
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.