Podczas wybierania sprzętu, na którym działać ma baza MySQL dużo uwagi zwraca się na rdzenie procesora, gigabajty pamięci, szybkość dysków twardych. Zdarza się, że umyka inny, bardzo ważny element. Mowa konkretnie o BBU (Battery Backup Unit), czyli po prostu o baterii do kontrolera. Dlaczego to jest tak ważne? Wykonałem prosty test aby to zobrazować.

Testowy system to platforma Intela z wbudowanym kontrolerem SAS. Kontroler to konkretnie SRCSASJV. Dysków SAS jest 6, skonfigurowane są w RAID10. Test został wykonany przy pomocy Sysbench’a uruchomionego z następującymi parametrami:

sysbench --num-threads=32 --max-requests=0 --max-time=3600 --test=oltp --oltp-table-size=100000000 --oltp-dist-type=uniform run

Łącznie dało to ok. 23GB danych w bazie testowej. Rozkład zapytań jest równomierny, tak aby jak najbardziej obciążyć dysk. Serwer MySQL skonfigurowany został z 256MB buffer pool, innodb_flush_method to O_DIRECT, tak aby InnoDB nie korzystało z cache systemowego. Jak widać powyżej, każdy test trwał godzinę. Łącznie wykonane zostało 8 powtórzeń. W przypadku pierwszych czterech testów na kontrolerze włączony został cache zapisu (writeback). Wyniki otrzymałem następujące:

transactions:                        166302 (46.19 per sec.)
transactions:                        168613 (46.83 per sec.)
transactions:                        162813 (45.22 per sec.)
transactions:                        168050 (46.67 per sec.)

W przypadku pozostałych cache zapisu był wyłączony (writethrough):

transactions:                        120811 (33.55 per sec.)
transactions:                        121927 (33.86 per sec.)
transactions:                        120810 (33.55 per sec.)
transactions:                        121226 (33.67 per sec.)

Jak widać, włączony cache zapisu to wzrost wydajności o ok. 50%. Włączenie cache zapisu na kontrolerze, który nie posiada sprawnej baterii, jest proszeniem się o katastrofę. Dlaczego? Sprawa jest prosta. Jeśli zapisy buforowane są w pamięci kontrolera, to w razie awarii serwera pamięć ta musi być podtrzymywana bateryjnie. Jeśli dane te zostaną utracone, uszkodzony zostanie system plików. Część danych, które teoretycznie zostały zapisane na dysku, fizycznie tam się nie znajduje, a to dla systemu plików sytuacja jest co najmniej dziwna. Do tego dochodzi ten sam problem na poziomie aplikacji – uszkodzone tabele MyISAM, błędy podczas startu InnoDB i inne tego typu przyjemności. Dlatego z resztą domyślną konfiguracją większości znanych mi kontrolerów jest właśnie wyłączenie cache zapisu jeśli nie ma podtrzymywania bateryjnego pamięci kontrolera.

Podsumowując, o takim drobiazgu jak bateria do kontrolera trzeba po prostu pamiętać. To nie jest tak duży wydatek, aby zrezygnować z kilkudziesięciu procent wydajności.