W jednym z moich środowisk produkcyjnych mamy dwa wystąpienia działające w klastrze RedHat, z jednym wystąpieniem produkcyjnym powiązanym z klastrem.
Mamy pamięć główną 125G z pulą buforów InnoDB 24G zajmowaną przez instancję 1 i 12G zajmowaną przez instancję 2, która nie jest powiązana z klastrem RedHat. Zarówno dzienniki danych, jak i dzienników transakcji znajdują się na partycji dysku LVM z systemem plików ext3.
W celu zwiększenia wydajności i lepszej przepustowości we / wy zdecydowałem się innodb_flush_method
na O_DIRECT
.
W odniesieniu do dokumentacji MySQL:
Gdzie danych InnoDB i pliki dziennika znajdują się w sieci SAN, stwierdzono, że ustawienie
innodb_flush_method
sięO_DIRECT
może pogorszyć osiągi prostychSELECT
wypowiedzi trzykrotnie.
Odnosząc się do wysokowydajnej wersji MySQL 2 i 3, stwierdzono, że programiści InnoDB znaleźli błędy w używaniu innodb_flush_method=O_DSYNC
. O_SYNC
i O_DSYNC
są podobne do fsync()
i fdatasync()
: O_SYNC
synchronizuje zarówno dane, jak i metadane, natomiast O_DSYNC
synchronizuje tylko dane.
Jeśli to wszystko wydaje się być wyjaśnieniem bez porady, oto rada:
jeśli używasz systemu operacyjnego typu Unix, a kontroler RAID ma pamięć podręczną na baterie, zalecamy użycie tej opcji
O_DIRECT
. Jeśli nie, domyślnie lubO_DIRECT
prawdopodobnie będzie najlepszym wyborem, w zależności od aplikacji.
Przez google otrzymałem ten raport porównawczy: na temat O_DSYNC
vsO_DIRECT
Raport Bench Mark: =================== Kompleksowy test transakcyjny rzędu 1B, 64 wątków * SAN O_DIRECT: żądania odczytu / zapisu: 31560140 (8766,61 na sekundę) * SAN O_DSYNC: żądania odczytu / zapisu: 5179457 (1438,52 na sekundę) * SAN fdatasync: żądania odczytu / zapisu: 9445774 (2623.66 na sekundę) * Dysk lokalny O_DIRECT: żądania odczytu / zapisu: 3258595 (905,06 na sekundę) * Dysk lokalny O_DSYNC: żądania odczytu / zapisu: 3494632 (970.65 na sekundę) * Fdatasync na dysku lokalnym: żądania odczytu / zapisu: 4223757 (1173,04 na sekundę
Jednak O_DIRECT
wyłącza pamięć podręczną poziomu OS, gdzie podwójne buforowanie może być wyłączona, które wykazują pewne lepsze I / O przepustowość.
Czy lepiej jest iść z O_DIRECT
, niż O_DSYNC
? Te dwie opcje są nieco mylące. Która opcja może wykazać lepszą przepustowość we / wy i zwiększenie wydajności bez żadnego wpływu na dane, odczyty / zapisy, szczególnie w środowisku produkcyjnym? Jakieś lepsze sugestie oparte na osobistych doświadczeniach?
Widziałem aktualizację Rolando w poście :
Nadal istnieje niewielkie zamieszanie dotyczące obu tych parametrów. Tam, gdzie mogłem zobaczyć większość szablonów konfiguracji produkcji
O_DIRECT
, nie widziałem żadnego zalecającegoO_DSYNC
.
System
- MySQL 5.1.51-enterprise-gpl-pro-log
- Red Hat Enterprise Linux Server wersja 5.5
- DELL DRAC z kontrolerem RAID z pamięcią podręczną zapisu 512 MB
- Kontrolery Dell PERC H700 z jednostką zasilania awaryjnego (BBU).
Dodatkowe informacje
mysql> pokaż zmienne takie jak 'innodb_thread_concurrency'; + --------------------------- + ------- + | Zmienna nazwa | Wartość | + --------------------------- + ------- + | innodb_thread_concurrency | 96 | + --------------------------- + ------- + 1 rząd w zestawie (0,00 s) mysql> pokaż zmienne takie jak 'innodb_read_io_threads'; Pusty zestaw (0,00 s) mysql> pokaż zmienne takie jak 'innodb_write_io_threads'; Pusty zestaw (0,00 s)
Używamy domyślnej wtyczki, więc zamieściłem informacje ze statusu InnoDB:
mysql> WYBIERZ * Z wtyczek GDZIE PLUGIN_NAME PODOBA „% innodb%” ORAZ PLUGIN_TYPE PODOBNY „SILNIK PRZECHOWYWANIA” \ G *************************** 1. wiersz ********************** ******* PLUGIN_NAME: InnoDB WERSJA PLUGIN: 1.0 PLUGIN_STATUS: AKTYWNY PLUGIN_TYPE: SILNIK MAGAZYNOWY PLUGIN_TYPE_VERSION: 50151,0 PLUGIN_LIBRARY: NULL PLUGIN_LIBRARY_VERSION: NULL PLUGIN_AUTHOR: Innobase OY PLUGIN_DESCRIPTION: Obsługuje transakcje, blokowanie na poziomie wiersza i klucze obce PLUGIN_LICENSE: GPL 1 rząd w zestawie (0,00 s)
Odpowiedzi:
21 stycznia 2009 r. Peter Zaitsev stwierdził na mysqlperformanceblog.com, co następuje
Jak dotąd nie wiem, by nikt nie dotknął tego problemu.
O_DSYNC
domyślnie nie jest atrakcyjną perspektywą, ale obsługuje szybsze zapisy, które nie są tak naprawdę weryfikowane. Dlatego wokół jest tyle szumuO_DIRECT
.Mogę powiedzieć, że nie masz zainstalowanej wtyczki InnoDB. Dzięki wtyczce InnoDB powinno istnieć kilka zmiennych.
Powinieneś zaktualizować InnoDB na jeden z dwóch sposobów:
Gdy to zrobisz, możesz ulepszyć InnoDB do
Oto moje poprzednie posty na temat ustawień, które możesz zmienić w tym celu:
Sep 12, 2011
: Czy można zmusić MySQL do korzystania z więcej niż jednego rdzenia?Sep 20, 2011
: Wiele rdzeni i wydajność MySQLApr 26, 2012
: Czy wydajność procesora jest istotna dla serwera bazy danych?Mar 16, 2012
: Używanie wielu rdzeni dla pojedynczych zapytań MySQL na Debianieźródło
Zawsze miałem wrażenie, że
O_DIRECT
jest lepsza pod względem wydajności, ponieważ zapobiega podwójnemu buforowaniu. Ponadto, pod warunkiem, że masz sprzętową macierz RAID z pamięcią podręczną zapisu zasilaną bateryjnie. Oczywiście zależy to również od obciążenia pracą, niezależnie od tego, czy jesteś ciężko CZYTAĆ, czy PISAĆ.Również pytanie do ekspertów: czy dodatkowych połączeń, aby
fsync()
zaO_DIRECT
przyczynę zauważalne pogorszenie ogólnej wydajności, czy jest to nieistotne? Muszę jeszcze zobaczyć, jak to pokazują testy porównawcze.Należy również pamiętać, że Percona umożliwiła ustawienie
innodb_flush_method=ALL_O_DIRECT
, które zapewnia bezpośrednie we / wy nie tylko w plikach danych InnoDB, ale także w dziennikach transakcji InnoDB w tym samym czasie.źródło