Przedstawiono mi kilka dedykowanych serwerów MySQL, które nigdy nie używają więcej niż jednego rdzenia. Jestem bardziej programistą niż DBA dla MySQL, więc potrzebuję pomocy
Ustawiać
Serwery są dość mocne z obciążeniem typu OLAP / DataWarehouse (DW):
- Podstawowa: 96 GB RAM, 8 rdzeni + pojedyncza macierz RAID 10
- Test: 32 GB pamięci RAM z 4 rdzeniami
- Największy DB to 540 GB, w sumie około 1,1 TB i głównie tabele InnoDB
- Solaris 10 Intel-64
- MySQL 5.5.x
Uwaga: Największa baza danych to replikowana z serwera OLTP DR, z której ładowana jest DW. Nie jest to pełny DW: trwa tylko od 6 miesięcy do 6 tygodni, więc jest mniejszy niż OLTP DB.
Obserwacje na serwerze testowym
- 3 oddzielne połączenia
- każdy ma współbieżny (i inny)
ALTER TABLE...DROP KEY...ADD INDEX
- 3 tabele mają 2,5, 3,8 i 4,5 miliona wierszy
- Zużycie procesora wzrasta do 25% (jeden rdzeń jest maksymalnie obciążony) i nie więcej
- 3 ALTERY zajmują 12–25 minut (jeden na najmniejszym zajmuje 4.5)
pytania
- Jakie ustawienie lub łatka jest wymagane, aby można było użyć więcej niż jednego rdzenia?
To znaczy, dlaczego MySQL nie używa wszystkich dostępnych rdzeni? (podobnie jak inne RDBMS) - Czy jest to konsekwencja replikacji?
Inne notatki
- Rozumiem różnicę między „wątkiem” RDBMS a „wątkiem” systemu operacyjnego
- Nie pytam o żadną formę paralelizmu
- Niektóre zmienne systemowe InnoDB i wątków nie są optymalne
(szukają szybkiej wygranej) - Krótko mówiąc, nie jestem w stanie zmienić układu dysku
- W razie potrzeby można dostosować system operacyjny
- Pojedyncza ALTER TABELA na najmniejszym stole zajmuje 4,5 minuty (szokujące IMO)
Edytuj 1
- innodb_thread_concurrency ma wartość 8 na obu. Tak, to źle, ale nie zmusza MySQL do używania wielu rdzeni
- Rozmiar innodb_buffer_pool_size wynosi 80 GB w wersji podstawowej, 10 GB w teście (inna instancja jest zamykana). Na razie jest OK.
- innodb_file_per_table = ON
Edytuj 2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = ON
- innodb_flush_method powinien mieć wartość O_DIRECT (ale SHOW VARIABLES tego nie pokazuje)
- innodb_doublewrite = OFF
- System plików = ZFS (i mój sysadmin znalazł to: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )
Testować
- Metoda innodb_flush_method nie jest wyświetlana jako O_DIRECT, kiedy powinna być
- będzie śledzić ustawienia RolandoMySQLDBA
Daj mi znać, jeśli coś przeoczyłem
Twoje zdrowie
Aktualizacja
Zmieniono metodę innodb_flush_method + 3 x wątek w odpowiedzi RolandoMySQLDBA
Wynik:> 1 rdzeń użyty do testów = wynik pozytywny
\G
. Ponadto myślę, że SHOW INNODB STATUS
jest przestarzała na korzyść wersji SHOW ENGINE INNODB STATUS
5.5 ( pojawia się błąd podczas uruchamiania pierwszego z wiersza poleceń.