Rejestrowanie obniża wydajność MySQL - ale dlaczego?

9

Jestem bardzo zaskoczony, że nie mogę znaleźć odpowiedzi na to gdziekolwiek na miejscu już, ani w dokumentacji MySQL ( sekcja 5.2 wydaje się być dobrze pokryte zalogowaniu inaczej!)

Po włączeniu binlogów widzę niewielki spadek wydajności (subiektywnie), którego należy się spodziewać przy odrobinie dodatkowego We / Wy - ale po włączeniu ogólnego dziennika zapytań widzę ogromny spadek wydajności (dwukrotnie dłuższy czas na uruchamianie zapytań, lub gorzej), znacznie przekraczając to, co widzę w binlogach. Oczywiście teraz rejestruję każdy WYBÓR, a także każdą AKTUALIZACJĘ / WSTAW, ale inne demony rejestrują każde żądanie (Apache, Exim) bez zatrzymywania się.

Czy widzę tylko efekty zbliżenia się do „punktu krytycznego” wydajności, jeśli chodzi o IO, czy też jest coś zasadniczo trudnego w rejestrowaniu zapytań, które to powoduje? Chciałbym móc rejestrować wszystkie zapytania, aby ułatwić programowanie, ale nie mogę usprawiedliwić tego rodzaju sprzętu, który wydaje się potrzebny do odzyskania wydajności przy ogólnym logowaniu zapytań.

Oczywiście rejestruję powolne zapytania, a jeśli je wyłączę, poprawa ogólnego zastosowania będzie nieznaczna.

(Wszystko to dotyczy Ubuntu 10.04 LTS, MySQLd 5.1.49, ale badania sugerują, że jest to dość uniwersalny problem)

James Green
źródło

Odpowiedzi:

9

Ogólne dzienniki zapytań to dużo więcej operacji IO niż dzienniki binarne. Poza tym, że większość serwerów SQL ma 90% odczytów do 10% zapisów, dzienniki binarne są przechowywane w formacie binarnym zamiast zwykłego tekstu, który zajmuje mniej miejsca na dysku. (Ile mniej miejsca? Nie jestem pewien. Przepraszam.)

Istnieją dwa aspekty, dlaczego Apache i Exim mogą rejestrować każde żądanie bez znaczącego wpływu na wydajność. Po pierwsze, rejestrują fakt, że żądanie miało miejsce, ale to, co umieszczają w dzienniku, jest zwykle znacznie mniejsze niż rzeczywiste żądanie. Żądanie HTTP jest często dwa razy większe niż linia w dzienniku, a nawet krótki tekst w postaci zwykłego tekstu jest 10 lub 20 razy większy niż linia dziennika, która mu towarzyszy. Wiadomość e-mail z załącznikiem 10 MB nadal będzie zawierała tylko kilka wierszy w dzienniku.

Drugą częścią tego jest to, że w normalnej aplikacji internetowej zwykle jest kilkadziesiąt zapytań SQL powiązanych z jedną stroną HTTP. Wiadomości e-mail mają zwykle mniejszą liczbę niż żądania HTTP. Twój serwer MySQL prawdopodobnie próbuje zarejestrować znacznie więcej niż Apache lub Exim.

Spójrz na rozmiar (nieskompresowany) dzienników binarnych i ogólnych MySQL oraz dzienników Apache i Exim na koniec dnia. Założę się, że okaże się, że ogólny dziennik MySQL jest największy co najmniej 5 razy.

Ladadadada
źródło
1
Kilka dobrych punktów - w szczególności tak, pojedynczy GET dla naszej aplikacji może spowodować setki WYBORÓW, ponieważ chociaż staramy się zrobić tyle, ile możemy w pojedynczym zapytaniu, czasami rezygnujemy z wydajności / czystości tego dla bardziej elegancka struktura, bardziej czytelny kod i czystsza baza danych. (Nawiasem mówiąc, cała ta sprawa zaczęła się od rozmowy o rejestrowaniu zawartości POST, a także adresu URL z GET, ponieważ widzimy parametry CGI.pm, które widzi w jednym przypadku, a nie w drugim, a stamtąd do logowania / wydajności w generał). W każdym razie minęło kilka godzin, więc odpowiedź została zaakceptowana. Dzięki!
James Green
4

Aby dodać do podanej odpowiedzi , zobaczysz także spadek wydajności, jeśli logujesz się na to samo urządzenie, na którym znajdują się Twoje magazyny danych MySQL - jeśli jest to ten sam dysk, będziesz czytać i zapisywać w wielu lokalizacjach cały czas, spowalniając cały proces.

Jest to prawdą, nawet jeśli jest to inna partycja na tym samym dysku fizycznym.

Jeśli rejestrowanie odbywa się na innym urządzeniu, powinno to złagodzić niektóre problemy z wydajnością.

królikarnia
źródło
1
Nie dotyczy mojej sytuacji - jest to hostowana maszyna wirtualna, a bazy danych znajdują się na osobnym woluminie logicznym do / var, udostępnianym z kolei z tej samej tablicy pamięci. Teoretycznie przypuszczam, że mogą być na tych samych wrzecionach, ale czułoby się to jak diabelski zbieg okoliczności :-) To powiedziawszy, +1 na bok, ponieważ byłoby to absolutnie odpowiednie dla kogoś z np. Domyślną instalacją Debiana / Ubuntu / var / mysql, loguje się w / var / log)!
James Green
@jimbo - dzięki za rekwizyty, nawet jeśli nie dotyczą bezpośrednio twojej konkretnej sytuacji :)
warren