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.
Odpowiedzi:
Oto wyjaśnienie, jak
fdatasync()
działa, a jakfsync()
działafdatasync()
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ępniefsync()
natychmiast wywołują , aby mieć pewność, że zapisane dane są fizycznie przechowywane na dysku twardym. Niestety,fsync()
zawsze zainicjuje dwie operacje zapisuJeś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_DSYNC
jest szybszy niżO_DIRECT
od dwukrotnegoO_DIRECT
wywołaniafsync()
(jeden dla dzienników i jeden dla danych) ifsync()
weryfikuje zapis danych za pomocą dwóch operacji zapisu. Korzystanie zO_DSYNC
połączeńfdatsync()
ifsync()
. Możesz myśleć o tym,fdatasync()
że wykonujesz asynchroniczniefsync()
(nie weryfikujesz danych).Patrząc na liczby,
O_DSYNC
wykonuje czteryfsync()
operacje zapisu, z których dwie są weryfikowane, a cztery operacje zapisu, wszystkie weryfikowane są później.WNIOSEK
O_DSYNC
O_DIRECT
O_DIRECT
Mam nadzieję, że ta odpowiedź pomoże i mam nadzieję, że nie pogorszyłem sytuacji.
źródło
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.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.).