Przejdź do treści

MySQL – optymalizacja i wydajność

O pracy MySQL DBA – przemyślenia administratora

Archiwa

Archiwa z daty Styczeń, 2011

Rozgrzewka

Sty 24

Jak powszechnie wiadomo, zanim człowiek jest w stanie osiągnąć maksymalny poziom wysiłku fizycznego dobrze jest się wcześniej rozgrzać. Podobnie jest z MySQL. Świeżo uruchomiony serwer MySQL to często dziesiątki gigabajtów cache i buforów, które czekają na zapełnienie. Dane znajdują się na dysku i muszą być dopiero wczytane do pamięci. W przypadku dużej ilości danych i dużych ilości pamięci ten proces trwa długo i przez ten czas serwer nie funkcjonuje z największą możliwą wydajnością. Przygotowałem krótki benchmark który, mam nadzieję, pokaże wyraźnie dlaczego ten cały „hot start” jest taki ważny.
czytaj dalej…

Poprzednio pisałem o tym, co znajduje się w pierwszej części raportu generowanego przez mk-query-digest. Dziś zajmiemy się resztą. Pierwsza sekcja to posortowana pod względem wybranego przez użytkownika atrybutu lista wszystkich schematów zapytań. Domyślnie sortowane są one po sumie czasu wykonania – na początku lądują schematy zapytania, które zajęły najwięcej czasu. Przykładowo taka sekcja może wyglądać tak:

# Profile
# Rank Query ID           Response time    Calls R/Call   Item
# ==== ================== ================ ===== ======== ================
#     1 0x2C4499CEBFBDE985   355.1854  9.0%    90   3.9465 SELECT ps_product  ps_product_lang ps_image ps_image_lang ps_tax ps_category_group  ps_category_product
#    2 0x043BCFC15A4C7F15   300.3267  7.6%    76   3.9517 SELECT allegro_auctions
#    3 0xF4230AF7750CF4AA   227.8298  5.8%    98   2.3248 UPDATE mybb_users
#    4 0xE1598CBB9AEE7DE1   149.4173  3.8%    49   3.0493 SELECT mybb_posts
#    5 0x4967BBEDCF36B29C   142.6522  3.6%    18   7.9251 SELECT jos_session
#    6 0x2DD7929E432F2112   139.5068  3.5%    50   2.7901 SELECT mybb_users mybb_userfields
#    7 0x05872ECC22546540   131.2421  3.3%    44   2.9828 DELETE jos_session
#    8 0xE8C426410BF3D7B0   130.6269  3.3%    19   6.8751 SELECT produkty seo
#    9 0x8921FDE85D08295F   114.1535  2.9%    45   2.5367 DELETE mybb_sessions
#   10 0xFACBD40CFACD1AAE   107.4832  2.7%    15   7.1655 UPDATE vld_members
#   11 0x19C1D3FB71C3F6F8    99.9117  2.5%    37   2.7003 SELECT mybb_sessions
#   12 0x71E6CCAC8F09C2E1    81.3847  2.1%    24   3.3910 DELETE mybb_sessions
#    13 0x9F0F56AE4E89EDEF    69.4614  1.8%    24   2.8942 SELECT  product_special review product product_description product_special  manufacturer stock_status product_discount
#   14 0xDC9489D1478B5CEF    68.0753  1.7%    11   6.1887 INSERT logi_www
#   15 0x6813B9B896477FF4    66.2721  1.7%    26   2.5489 SELECT mybb_threads
#   16 0x127EB9004F7C71C3    58.2252  1.5%    10   5.8225 SELECT produkty seo
#   17 0x4DDD16DF961337F4    54.4435  1.4%    21   2.5925 UPDATE stats_counters
#   18 0x7F84F05DFBF5C3E3    52.7417  1.3%    13   4.0571 SELECT produkty producenci
#   19 0x39EF8414BAABF63A    51.4078  1.3%    16   3.2130 SELECT mybb_privatemessages
#   20 0x50B012B84A236154    49.7462  1.3%    22   2.2612 UPDATE jos_session
#   21 0x813031B8BBC3B329    46.4510  1.2%    11   4.2228 COMMIT
#   22 0xE8AEB5F449FBFCFD    45.8707  1.2%    20   2.2935 UPDATE mybb_sessions
#   24 0x4CE83FC120FC4C2E    34.6862  0.9%    13   2.6682 SELECT produkty
#   25 0x13883BD7B91A0823    34.3275  0.9%    16   2.1455 SELECT mybb_threads mybb_users mybb_threadratings mybb_threadprefixes
#   26 0x10590E2776FFB443    33.8784  0.9%    20   1.6939 SELECT mybb_privatemessages
#   30 0x58E0C2660F51564E    30.4800  0.8%    18   1.6933 UPDATE mybb_threads
#   31 0xA2D023311A41CD63    30.3245  0.8%    10   3.0324 SELECT vld_members vld_members_data_members
#   42 0xE80ED521B2432DA1    19.2108  0.5%    10   1.9211 INSERT mybb_posts
# MISC 0xMISC              1207.7081 30.7%   402   3.0042 <186 ITEMS>

czytaj dalej…

Tak jak obiecałem w poprzednim poście, tym razem opiszę dlaczego narzędzie mk-query-digest jest czymś genialnym, dlaczego Barona Schwartza należałoby ozłocić i dlaczego trudno mi wyobrazić sobie pracę bez tego narzędzia.

W trakcie analizy wydajności serwera i szukania przyczyn wolniejszego działania bazy najbardziej przydatnym źródłem informacji dla administratora są slowlogi. Dawno dawno temu opisywałem (tu i tu) jakie informacje można w nich znaleźć. W zależności od tego, jaką wersję serwera MySQL używamy może ich być mniej lub więcej. W przypadku Percona Server informacji tych jest zazwyczaj wystarczająco aby zlokalizować zapytanie będące przyczyną problemu – zapytanie to jednak najpierw musi do logów trafić. Domyślnie, MySQL loguje zapytania o czasie wykonywania dłuższym niż 10 sekund. W większości wypadków jest to dużo za dużo. Osobiście stosuję long_query_time=1;. W przypadku interaktywnej pracy z bazą (czyli ktoś klika na stronie, zapytanie idzie do bazy a w tym czasie użytkownik czeka na wynik) jedna sekunda to takie minimum przyzwoitości. Jeśli konieczne jest dłuższe oczekiwanie, użytkownik zacznie się frustrować. Zazwyczaj takie ustawienie logowania wystarczy, aby wyłapać te zapytania, które są nieoptymalne i które są przyczyną dużego obciążenia CPU czy dysku. Problem pojawia się jednak wtedy, gdy w slowlogu niczego podejrzanego nie widać. Oczywiście, rozwiązaniem jest włączenie logowania wszystkich zapytań – ustawiamy zmienną long_query_time na 0. W ten sposób wszystkie zapytania trafiają do slowlogów a my liczymy na to, że skoro przyczyną nie jest jedno długie zapytanie, to może będzie to większa liczba szybkich. Niestety, tu mamy kolejny problem. O ile kilkaset zapytań w logu możemy ręcznie przeglądnąć i przeanalizować, to po włączeniu logowania wszystkich zapytań do logów trafią nawet miliony zapytań dziennie. Tego już nie da się ręcznie przeglądnąć. Tu przydaje się agregator taki jak mk-query-digest.
czytaj dalej…

Witam drogich Czytelników w nowym roku. Dziś będzie post głównie na moje własne potrzeby, ale mam nadzieję, że komuś także się przyda.

Zauważamy, że mamy problem z serwerem – zaczyna zwalniać, praktycznie nie wyrabia. Podejrzewamy, że związanie jest to w jakiś sposób z bazą danych, ale jako że nie jesteśmy zbyt biegli w tym temacie, chcielibyśmy się skonsultować z osobą bardziej zorientowaną. Znajdujemy forum, na którym moglibyśmy szukać pomocy. W jaki sposób opisać problem aby ta pomoc była jak najbardziej użyteczna i aby obyło się bez kilku rund wymiany postów, które nic do rozwiązania problemu nie wnoszą?
czytaj dalej…