Wyjaśnienie zmiennej MySQL innodb_flush_method

21

Zacznę od przyznania, że ​​jestem bardzo nieświadomy wewnętrznego działania dysków twardych. Więc kiedy przeczytałem instrukcję dla zmiennej innodb_flush_method , to mnie pomieszało. Czy mogę uzyskać wyjaśnienie w terminach laika dotyczące różnicy w O_DSYNC i O_DIRECT oraz jak się dowiedzieć, czy to problem z wydajnością na serwerze bazy danych.

Niektóre statystyki w mojej instalacji: Mac OSX 10.6 (jądro 32-bitowe, ponieważ architektura jest nieaktualna) z MySQL 5.1.49-64bit (mam nadzieję, że pozwoli mi to na użycie pamięci). 8 GB pamięci RAM, ~ 6 GB danych / indeksów innodb.

Derek Downey
źródło
2
Nie wiem, czy Mac OS X obsługuje właściwą bezpośrednią opcję IO - nie sądziłem, że tak. Jesteś drugą osobą, którą widziałem dzisiaj, która jest zdezorientowana tą stroną podręcznika. Mam tutaj otwarty błąd: bugs.mysql.com/bug.php?id=54306
Morgan Tocker

Odpowiedzi:

16

Oto wyjaśnienie, jak fdatasync()działa, a jak fsync()działa

fdatasync()opróżnia wszystkie bufory danych pliku na dysk (przed powrotem wywołania systemowego). To przypomina, fsync()ale nie jest wymagane do aktualizacji metadanych, takich jak czas dostępu. Aplikacje, które uzyskują dostęp do baz danych lub plików dziennika, często zapisują niewielki fragment danych (np. Jeden wiersz w pliku dziennika), a następnie fsync()natychmiast wywołują , aby mieć pewność, że zapisane dane są fizycznie przechowywane na dysku twardym. Niestety, fsync()zawsze zainicjuje dwie operacje zapisu

  • jedna operacja zapisu dla nowo zapisanych danych
  • jedna operacja zapisu w celu zaktualizowania czasu modyfikacji przechowywanego w i-węźle

Jeśli czas modyfikacji nie jest częścią koncepcji transakcji, fdatasync()można go użyć, aby uniknąć niepotrzebnych operacji zapisu na dysku i-węzłowym.

W języku angielskim O_DSYNCjest szybszy niż O_DIRECTod dwukrotnego O_DIRECTwywołania fsync()(jeden dla dzienników i jeden dla danych) i fsync()weryfikuje zapis danych za pomocą dwóch operacji zapisu. Korzystanie z O_DSYNCpołączeń fdatsync()i fsync(). Możesz myśleć o tym, fdatasync()że wykonujesz asynchronicznie fsync()(nie weryfikujesz danych).

Patrząc na liczby, O_DSYNCwykonuje cztery fsync()operacje zapisu, z których dwie są weryfikowane, a cztery operacje zapisu, wszystkie weryfikowane są później.

WNIOSEK

  • O_DSYNC
    • szybszy niż O_DIRECT
    • Dane mogą / mogą nie być spójne z powodu opóźnienia lub bezpośredniej awarii
  • O_DIRECT
    • bardziej stabilny
    • spójne dane
    • naturalnie wolniejszy

Mam nadzieję, że ta odpowiedź pomoże i mam nadzieję, że nie pogorszyłem sytuacji.

RolandoMySQLDBA
źródło
2
Warto zauważyć: O_DIRECT jest używany tylko w plikach obszaru tabel, a nie w dziennikach. Również - to, czy O_DIRECT będzie przydatny, czy nie, zależy od sprzętu. Jako komentarz do pytania autora podłączyłem błąd dotyczący otwartej dokumentacji.
Morgan Tocker
Dziękuję za wyjaśnienie, Morgan. Naprawię to.
RolandoMySQLDBA
O_DSYNC to zapis synchroniczny, jak możesz dojść do wniosku, że jest on szybszy niż asynchroniczny + fsync?
noonex
@noonex fdatasync () jest synchroniczny dla swoich danych, a nie dla metadanych. Według 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.kiedy pisałem mój post 3,5 lat temu, było to prawdą, szczególnie w przypadku starszych wersji Linuksa.
RolandoMySQLDBA
@ noonex Według 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.(Wiki ostatnio zaktualizowano 28 lipca 2014 r.).
RolandoMySQLDBA