Warum zeigen MySQL-Threads häufig den Status "Elemente freigeben" an, wenn der Abfrage-Cache deaktiviert ist?

16

Wenn ich laufe SHOW PROCESSLIST, gibt es oft eine große Anzahl von INSERT / UPDATE-Threads im Status "Elemente freigeben".

Das MySQL-Handbuch schlägt vor, dass zumindest ein Teil des Grundes dafür, dass sich ein Thread in diesem Zustand befindet, im Abfrage-Cache liegt - vermutlich würde dies die zwischengespeicherten Abfragen aufgrund der geänderten Daten ungültig machen.

My query_cache_sizeist jedoch auf 0 gesetzt, wodurch der Abfragecache insgesamt deaktiviert werden sollte.

Welche anderen Gründe gäbe es, um so viele Threads in diesem Zustand zu haben?

Die entsprechenden Tabellen verwenden die InnoDB-Speicher-Engine.

Dan Grossman
quelle

Antworten:

7

Überprüfen Sie den Wert von innodb_thread_concurrency.

Bei meinem System führte eine Erhöhung des Werts von 8 auf 32 gemäß den Richtlinien in der MySQL-Dokumentation zu einer erkennbaren Verringerung der Anzahl der Threads, die gleichzeitig den Status "Elemente freigeben " melden. Außerdem ist die beobachtete durchschnittliche Abfragezeit um eine Größenordnung gesunken.

Während dies einen großen Unterschied in der Server-Gesamtleistung ausmachte, war dies nicht die Silberkugel für die Befreiung von Gegenständen. Mein Hardware-Ökosystem lässt mich die Hypothese aufkommen, dass dieser Zustand hauptsächlich auf Systemen mit "langsamen" Festplatten (RAID 1 mit 2x10.000 Festplatten) und auf Systemen mit schnellerem Speicher (RAID 10 mit 12x15.000 Festplatten) auftritt. Daher kann auch eine Überprüfung der Festplattenleistung erforderlich sein.

Viel Glück!

Ebenfalls:

Es ist erwähnenswert, dass der Standardwert von innodb_thread_concurrency je nach verwendetem 5.0-Punkt-Release radikal unterschiedlich ist.

Der Standardwert wurde mehrmals geändert: 8 vor MySQL 5.0.8, 20 (unendlich) von 5.0.8 bis 5.0.18, 0 (unendlich) von 5.0.19 bis 5.0.20 und 8 (endlich) von 5.0.21 auf. - Quelle

Dies bedeutet, dass ein scheinbar harmloses Upgrade von 5.0.20 auf 5.0.21 die Standardeinstellung von unendlich auf 8 änderte und die Leistungsauswirkungen mit sich brachte.

jphofmann
quelle
Hatte ein ähnliches Problem wie dieses und es hing direkt mit langsamen Festplattengeschwindigkeiten zusammen. Eine Analyse der Festplattengeschwindigkeit ergab, dass das Schreiben und Lesen auf die Festplatte sehr langsam war. Dies hatte Auswirkungen auf MySQL, weshalb die Status "Elemente freigeben" (mit denselben Abfragen) lange Zeit in der Prozessliste angezeigt wurden. Das Problem wurde behoben, indem die anderen Prozesse beendet wurden, die die Festplattengeschwindigkeit verlangsamten.
Navigatron
5

Das Freigeben von Elementen ist eine Abfrageausführungsphase, in der temporäre Strukturen, Puffer usw. freigegeben werden. In dieser Phase wird ein Teil des Abfragecaches ausgeführt, aber dies ist nicht das einzige, was dort geschieht. Ich würde vorschlagen, SHOW PROFILES zu verwenden, um zu sehen, wie lange diese Phase im Verhältnis zu anderen Phasen dauert, und wenn die Zeit, die verbraucht wird, ein Problem darstellt, Fehlerbehebung mit Tools wie dem Profiler und dem Oprofile für Arme.

Baron Schwartz
quelle
Vielen Dank, dass Sie sich für die Befreiung von Gegenständen entschieden haben. Gibt es spezielle Dokumente, in denen dies genau beschrieben ist, oder ist dies nur eine Google-Übung für mich?
RolandoMySQLDBA
Oder stöbern Sie in der Übung zum Quellcode! :)
Derek Downey
3

Es gab einen Fehlerbericht zu diesem Problem, der das Freigeben von Elementen und den Abfragecache betraf . Obwohl der Bug geschlossen ist, wurde innodb_thread_concurrency nicht erwähnt .

Zufällig habe ich im Mai mit Ronald Bradford bei Percona Live NYC gesprochen. Ich erzählte ihm von einer Situation, in der ich innodb_thread_concurrency getweeked habe, weil der mehrfache InnoDB-Pufferpool von MySQL 5.5 eine Menge Thread-Sperren verursachte und ich vermutete, dass sich die zwischengespeicherten Daten, die ich am wahrscheinlichsten benötigte, auf die mehrfachen Pufferpools verteilt hatten.

Er sagte mir klar, dass ich niemals Werte gegen innodb_thread_concurrency setzen sollte. Es sei immer der Standardwert, der jetzt Null (0) ist. Auf diese Weise können Sie vom InnoDB-Speicher selbst entscheiden, wie viele innodb_concurrency_tickets generiert werden sollen. Dies ist es, was die unendliche Parallelität bewirkt.

Das Freigeben von Elementen tritt höchstwahrscheinlich häufiger auf, wenn wir innodb_thread_concurrency Beschränkungen auferlegen. Das sollte immer Null sein (0). Ich würde ein Risiko eingehen und innodb_concurrency_tickets erhöhen und sehen, ob es hilft oder nicht.

RolandoMySQLDBA
quelle
2

Wir hatten ein Problem mit genau den gleichen Symptomen. Es stellte sich heraus, dass der Datenträger mit den InnoDB-Protokolldateien voll ist. Eine Prüfung wert.

RedBlueThing
quelle
Sie benötigen viel größere Protokolldateien. Tatsächlich ist die größte Protokolldatei, die mit der Standardeinstellung innodb_log_files_in_group (2) zulässig ist, 2047 MB ​​groß. Sie sollten mysql herunterfahren, rm -f / var / lib / ib_logfile [01], innodb_log_file_size = 2047M in /etc/my.cnf erstellen und mysql starten. Natürlich eine größere Scheibe besorgen !!!
RolandoMySQLDBA
1

Noch ein Hinweis: Könnte innodb fsync () sein. Versuchen Sie die Einstellung

innodb_flush_log_at_trx_commit = 2

In my.cnf

Die innodb-Protokolldatei wird dann alle 1-2 Sekunden auf die Festplatte geschrieben, stattdessen bei jedem Commit ob. Leichte Beeinträchtigung der Datenintegrität, großer Geschwindigkeitsgewinn.

sto
quelle