Jak w pełni wykorzystać MySQL na maszynie QuadCore z 16 GB pamięci RAM?

10

Korzystam z serwera MySQL 5.5 na mojej stacji roboczej do analizy danych naukowych i zastanawiam się, jak skonfigurować MySQL, aby uzyskać jak najwięcej z jego wydajności. Typy zapytań, które zwykle uruchamiam, obejmują połączenia 10-20 tabel i mogą być uruchamiane dość długo, od jednej do kilku minut nie stanowi żadnego wyjątku. Tylko bardzo niewielu użytkowników uzyskuje dostęp do bazy danych jednocześnie (maksymalnie 5). Przeniosłem serwer z Lenovo Thinkpad T61 z dwurdzeniowym procesorem 2,2 GHz i 4 GB pamięci RAM na nową maszynę z ręcznie dobranymi komponentami:

  • Intel i7 3770, 4x 3,4 GHz (działający przy 4x3,7 GHz)
  • Chipset Z77
  • 16 GB pamięci RAM DDR3 1600
  • Windows 7 Prof 64-bitowy
  • Windows i serwer MySQL działają na dysku SSD Intel serii 520.

Pierwsze testy (uruchamiające to samo zapytanie na obu komputerach) wykazały zdecydowaną poprawę szybkości dla nowego, ale zapytania wciąż zajmują dużo czasu i spodziewałem się większej poprawy. Zapytania te są dość dobrze zoptymalizowane, tzn. Wszystkie tabele mają odpowiedni klucz, który jest również używany jako „wyjaśnij rozszerzone”.

Teraz moje obecne ustawienia MySQL: Po pierwsze powinienem wspomnieć, że już dawno przeprowadziłem się z MyISAM do Innodb.

Niektóre moje poprawki my.ini (tj. Odstępstwa od ustawień domyślnych):

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system.  Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M

general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries

Chciałbym wiedzieć, czy ktoś zasugeruje zmiany w powyższych liczbach, a nawet dalsze ustawienia, których nie znam.

Byłbym wdzięczny za każdą przydatną uwagę.

Steve

EDYCJA: Mam dwa zapytania dotyczące połączeń między 10-20 tabelami i uruchomiłem je na moim laptopie Lenovo i nowym komputerze. Zapytanie nr 1 zajęło 3m36 na nowej maszynie w porównaniu z 9m11 na laptopie; Zapytanie nr 2 zajęło 22,5 sekundy na stacji roboczej w porównaniu z 48,5 sekundy na laptopie. Szybkość wykonania została więc poprawiona z grubsza o współczynnik 2-2,5. Na stacji roboczej nie wykorzystano nawet 50% pamięci RAM. Średnie obciążenie procesora w czterech rdzeniach (raportowane przez Menedżera zadań Windows) wyniosło tylko około 13%. Obciążenie na rdzeń (jak podaje Temp rdzenia) wyniosło około 25-40% dla JEDNEGO rdzenia, podczas gdy było <= 10% dla pozostałych, co wskazuje, że MySQL nie korzysta z wielu rdzeni dla pojedynczego zapytania .

Steve06
źródło
Pokaż obciążenie serwera, więc sprawdź pamięć, io, obciążenia procesora itp.
Przeprowadzę kilka testów i
To powinno wystarczyć do pierwszego wskazania, gdzie jest twój problem.
właśnie dodał kilka statystyk.
2
Ponadto możesz wypróbować kreatora Percona, aby uzyskać „zalecane” ustawienia dla serwera bazy danych na tools.percona.com/wizard
Stephen Senkomago Musoke

Odpowiedzi:

5

Ponieważ korzystasz z MySQL 5.5, możesz rozważyć skonfigurowanie InnoDB w celu uzyskania dostępu do wielu rdzeni

Oto ustawienia, których powinieneś używać

innodb_thread_concurrency określa górną granicę liczby współbieżnych wątków, które InnoDB może utrzymywać otwarte. Najlepsza zaokrąglona liczba do ustawienia to (2 x liczba procesorów) + liczba dysków. AKTUALIZACJA : Jak dowiedziałem się z pierwszej ręki podczas konferencji w Nowym Jorku w Percona, powinieneś ustawić tę wartość na 0, aby ostrzec InnoDB Storage Engine, aby znalazł najlepszą liczbę wątków dla środowiska, w którym działa.

innodb_concurrency_tickets ustawia liczbę wątków, które mogą bezkarnie ominąć sprawdzanie współbieżności. Po osiągnięciu tego limitu sprawdzanie współbieżności wątków ponownie staje się normą.

innodb_commit_concurrency ustawia liczbę jednoczesnych transakcji, które można zatwierdzić. Ponieważ wartością domyślną jest 0, brak ustawienia tej opcji umożliwia jednoczesne zatwierdzenie dowolnej liczby transakcji.

innodb_thread_sleep_delay ustawia liczbę milisekund, w których wątek InnoDB może zostać uśpiony przed ponownym wprowadzeniem kolejki InnoDB. Domyślnie jest to 10000 (10 sekund).

innodb_read_io_threads i innodb_write_io_threads (oba od MySQL 5.1.38) przydzielają określoną liczbę wątków do odczytu i zapisu. Domyślnie jest to 4, a maksymalna to 64.

innodb_replication_delay nakłada opóźnienie wątku na urządzenie podrzędne, osiągnięto innodb_thread_concurrency.

Oto moje poprzednie posty na MySQL 5.5 i aktywowanie wielu rdzeni dla InnoDB

RolandoMySQLDBA
źródło
2

Wiodący konsultant MySQL Percona oferuje kreatora konfiguracji MySQL . Umożliwia konfigurację w my.cnf/my.inizależności od konfiguracji systemu.

Również ludzie z Percona wydali książkę o nazwie „ High Performance MySQL ”. Trzecie wydanie zostało niedawno wydane i zawiera szczegółowe informacje o tuningu.

Mahesh Patil
źródło
czy te wartości sugerują dobrą wydajność, czy tylko wypluwają to, co wprowadzam?
OpenCoderX
1

Wykorzystanie pamięci: patrz http://mysql.rjweb.org/doc.php/memory (większość tunerów nie zrobi wystarczającej różnicy, aby mieć znaczenie.)

max_heap_table_size = 4000 M jest niebezpiecznie wysoki! Jeśli 4 użytkowników tego potrzebuje, brakuje pamięci RAM i następuje zamiana. Zamiana szkodzi wydajności znacznie bardziej niż cokolwiek innego.

Zapytania trwające dłużej niż kilka sekund: należy je przeanalizować pod kątem poprawy; proszę podać POKAŻ TWORZENIE TABELI; POKAŻ STATUS TABELI; WYBIERZ WYBÓR

Rick James
źródło
0

Możesz również rozważyć inne opcje. Takich jak PostgreSQL na FreeBSD. Ale przejście z systemu Windows na Linux zwiększy wydajność.

ilhan
źródło