Jeśli mogę powiedzieć o MySQL, że InnoDB, jego transakcyjny silnik (zgodny z ACID), jest rzeczywiście wielowątkowy. Jest jednak tak wielowątkowy, jak TY JESTEŚ KONFIGUROWANY !!! Nawet natychmiast po wyjęciu z pudełka InnoDB działa świetnie w środowisku pojedynczego procesora, biorąc pod uwagę jego ustawienia domyślne. Aby skorzystać z możliwości wielowątkowości InnoDB, należy pamiętać o aktywowaniu wielu opcji.
innodb_thread_concurrency ustawia 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.
innodb_read_ahead_threshold pozwala na liniowe odczyty ustalonej liczby zakresów (64 strony [strona = 16K]) przed przejściem na odczyt asynchroniczny.
Czas uciekłby mi, gdybym wymienił więcej opcji. Możesz o nich przeczytać w Dokumentacji MySQL .
Większość ludzi nie wie o tych funkcjach i jest całkiem zadowolona z tego, że InnoDB robi tylko transakcje zgodne z ACID. Jeśli poprawisz którąś z tych opcji, zrobisz to na własne ryzyko.
Grałem z instancjami wielu puli buforów MySQL 5.5 (162 GB w 9 instancjach pul buforów) i próbowałem w ten sposób automatycznie partycjonować dane w pamięci. Niektórzy eksperci twierdzą, że powinno to zapewnić 50% poprawę wydajności. Dostałem mnóstwo blokowania wątków, które sprawiły, że InnoDB zaczęło się czołgać. Przełączyłem się na 1 bufor (162 GB) i wszystko znów było dobrze na świecie. Sądzę, że potrzebujesz ekspertów Percona, aby to ustawić. Jutro będę na konferencji Percona MySQL w Nowym Jorku i zapytam o to, czy nadarzy się okazja.
Podsumowując, InnoDB zachowuje się dobrze na serwerze z wieloma procesorami, biorąc pod uwagę jego domyślne ustawienia dla operacji wielowątkowych. Poprawianie ich wymaga wielkiej staranności, wielkiej cierpliwości, świetnej dokumentacji i wspaniałej kawy (lub Red Bulla, Jolta itp.).
Dzień dobry, dobry wieczór i dobranoc !!!
AKTUALIZACJA 27.05.2011 20:11
Wróciłem z konferencji Percona MySQL w Nowym Jorku w czwartek. Co za konferencja. Wiele się nauczyłem, ale dostałem odpowiedź, na którą się przyjrzę, dotyczącą InnoDB. Ronald Bradford poinformował mnie, że ustawienie innodb_thread_concurrency na 0 pozwoli InnoDB zdecydować wewnętrznie o najlepszym sposobie działania z współbieżnością wątków. Będę eksperymentować z tym dalej w MySQL 5.5.
AKTUALIZACJA 2011-06-01 11:20
Jeśli chodzi o jedno długie zapytanie, InnoDB jest zgodny z ACID i działa bardzo dobrze przy użyciu MultiVersion Concurrency Control . Transakcje powinny być w stanie przenosić poziomy izolacji (domyślnie powtarzalne odczyty), które zapobiegają blokowaniu dostępu do danych innym osobom.
Jeśli chodzi o systemy wielordzeniowe, InnoDB przeszedł długą drogę. W przeszłości InnoDB nie działało dobrze w środowisku wielordzeniowym. Pamiętam, że musiałem uruchamiać wiele instancji mysql na jednym serwerze, aby uzyskać wiele rdzeni do dystrybucji wielu procesów mysqld na procesory. Nie jest to już konieczne, dzięki Perconie, a później MySQL (eh, Oracle, mówiąc, że wciąż mnie to wymiotuje), ponieważ opracowali InnoDB w bardziej dojrzały silnik pamięci masowej, który może uzyskiwać dostęp do rdzeni w prosty sposób bez konieczności dostrajania. Obecna instancja InnoDB może dziś dobrze działać na serwerze z jednym rdzeniem.