Dlaczego wątki MySQL często pokazują status „zwolnienia elementów”, gdy pamięć podręczna zapytań jest wyłączona?

16

Podczas uruchamiania SHOW PROCESSLISTczęsto występuje duża liczba wątków WSTAW / AKTUALIZACJA w stanie „uwalnianie elementów”.

Podręcznik MySQL sugeruje, że przynajmniej część przyczyny, dla której wątek jest w tym stanie, obejmuje pamięć podręczną zapytań - prawdopodobnie byłoby to unieważnianie zapytań buforowanych z powodu zmienionych danych.

Jednak my query_cache_sizeustawiono na 0, co powinno całkowicie wyłączyć pamięć podręczną zapytań.

Jakie byłyby inne powody, by mieć tyle wątków w tym stanie?

Odpowiednie tabele wykorzystują silnik pamięci InnoDB.

Dan Grossman
źródło

Odpowiedzi:

7

Sprawdź wartość innodb_thread_concurrency.

Dla mojego systemu zwiększenie wartości z 8 do 32, zgodnie z wytycznymi w dokumentacji MySql , spowodowało zauważalny spadek liczby wątków jednocześnie zgłaszających stan „zwolnienia elementów”. Ponadto zmniejszony średni czas zapytania spadł o rząd wielkości.

Chociaż miało to duży wpływ na ogólną wydajność serwera, nie była to srebrna kula „uwalniania przedmiotów”. Mój ekosystem sprzętowy prowadzi mnie do hipotezy, że ten stan występuje głównie w systemach z „wolnymi” dyskami (2 x 10 000 dysków RAID 1) i jest mniej powszechny w systemach z szybszą pamięcią (RAID 10 x 15 000 dysków). Dlatego sprawdzenie wydajności dysku może być również uzasadnione.

Powodzenia!

Również:

Warto zauważyć, że domyślna wartość innodb_thread_concurrency różni się diametralnie w zależności od używanego wydania 5.0-punktowego.

Wartość domyślna zmieniała się kilka razy: 8 przed MySQL 5.0.8, 20 (nieskończona) z 5.0.8 do 5.0.18, 0 (nieskończona) z 5.0.19 do 5.0.20 i 8 (skończona) z 5.0.21 na. - źródło

Oznacza to, że pozornie nieszkodliwe uaktualnienie z 5.0.20 do 5.0.21 zmieniło wartość domyślną z nieskończonego na 8 i przyniosło ze sobą konsekwencje dla wydajności.

jphofmann
źródło
Miał podobny problem i był bezpośrednio związany z niską prędkością dysku twardego. Przeprowadzenie analizy prędkości dysku wykazało, że zapisywanie i odczytywanie na dysk twardy przebiegało bardzo wolno. Miało to wpływ na MySQL i dlatego stany „Uwalnianie elementów” (z tymi samymi zapytaniami) pokazywały się przez długi czas na liście procesów. Problem polegał na zabiciu innych procesów spowalniających szybkość dysku twardego.
Navigatron
5

Uwalnianie elementów to etap wykonywania zapytania, w którym tymczasowe struktury, bufory itp. Są zwalniane. Na tym etapie wykonywana jest część pamięci podręcznej zapytań, ale to nie jedyne, co się tam dzieje. Sugerowałbym użycie POKAŻ PROFILE, aby zobaczyć, jak długo trwa ten etap w stosunku do innych etapów, a jeśli czas zajmuje problem, rozwiązywanie problemów za pomocą narzędzi takich jak profiler biedaka i profil.

Baron Schwartz
źródło
Dziękujemy za wyzerowanie, czym jest „uwalnianie przedmiotów”. Czy są jakieś szczegółowe dokumenty, które go szczegółowo opisują, czy jest to dla mnie ćwiczenie Google?
RolandoMySQLDBA
Lub przejrzyj ćwiczenie kodu źródłowego! :)
Derek Downey
3

Zgłoszono błąd dotyczący tego problemu dotyczącego „zwalniania elementów” i pamięci podręcznej zapytań . Chociaż błąd jest zamknięty, nie było wzmianki o innodb_thread_concurrency .

Przypadkowo rozmawiałem z Ronaldem Bradfordem w Percona Live NYC w maju. Powiedziałem mu o sytuacji, w której poprawiłem innodb_thread_concurrency, ponieważ wiele puli buforów InnoDB w MySQL 5.5 wytworzyło mnóstwo blokowania wątków i podejrzewałem, że dane w pamięci podręcznej najprawdopodobniej rozprzestrzeniły się w wielu pulach buforów.

Powiedział mi wprost, że nigdy nie powinienem ustawiać wartości względem innodb_thread_concurrency. Niech zawsze będzie wartością domyślną, która wynosi teraz zero (0). W ten sposób pozwalasz pamięci InnoDB decydować o tym, ile innodb_concurrency_tickets ma generować samodzielnie. To właśnie robi nieskończona współbieżność.

„Uwalnianie przedmiotów” najprawdopodobniej występuje częściej, gdy nakładamy ograniczenia na innodb_thread_concurrency. To zawsze powinno wynosić zero (0). Zaryzykuję i podniosę innodb_concurrency_tickets i zobaczę, czy to pomoże, czy nie.

RolandoMySQLDBA
źródło
2

Mieliśmy problem z dokładnie tymi samymi objawami. Okazało się, że dysk z plikami dziennika InnoDB zapełnił się. Warto sprawdzić.

RedBlueThing
źródło
Potrzebujesz znacznie większych plików dziennika. W rzeczywistości największe dozwolone pliki dziennika z domyślną wartością innodb_log_files_in_group (czyli 2) to 2047M. Powinieneś zamknąć mysql, rm -f / var / lib / ib_logfile [01], zrobić innodb_log_file_size = 2047M w /etc/my.cnf i uruchomić mysql. Oczywiście zdobądź większy dysk !!!
RolandoMySQLDBA
1

Kolejna wskazówka: może być innodb fsync (). Spróbuj ustawić

innodb_flush_log_at_trx_commit = 2

W my.cnf

Plik dziennika innodb jest następnie opróżniany na dysk co 1-2 sekundy, zamiast tego ob przy każdym zatwierdzeniu. Nieznaczna kara za integralność danych, wielki wzrost prędkości.

sto
źródło