it-swarm.com.de

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

Wenn ich SHOW PROCESSLIST gibt es häufig 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, den Abfrage-Cache betrifft - vermutlich würde er zwischengespeicherte Abfragen aufgrund der geänderten Daten ungültig machen.

Mein query_cache_size wird auf 0 gesetzt, wodurch der Abfragecache insgesamt deaktiviert werden soll.

Welche anderen Gründe würde es geben, so viele Threads in diesem Zustand zu haben?

Die relevanten Tabellen verwenden die InnoDB-Speicher-Engine.

16
Dan Grossman

Überprüfen Sie den Wert von innodb_thread_concurrency.

Bei meinem System führte das Erhöhen des Werts von 8 auf 32 gemäß den Richtlinien in MySql-Dokumentation zu einer erkennbaren Verringerung der Anzahl der Threads, die gleichzeitig den Status "Freigeben von Elementen" melden. Außerdem sank die beobachtete durchschnittliche Abfragezeit um eine Größenordnung.

Dies machte zwar einen großen Unterschied in der Gesamtleistung des Servers aus, war jedoch nicht die Silberkugel "Befreien von Gegenständen". Mein Hardware-Ökosystem lässt mich die Hypothese aufstellen, dass dieser Status hauptsächlich auf Systemen mit "langsamen" Festplatten (2x10k-Festplatten-Raid 1) auftritt und auf Systemen mit schnellerem Speicher (12x15k-Festplatten-Raid 10) weniger verbreitet ist. Daher kann auch eine Überprüfung der Festplattenleistung erforderlich sein.

Viel Glück!

Ebenfalls:

Es ist anzumerken, dass der Standardwert von innodb_thread_concurrency radikal unterschiedlich ist, je nachdem, welche 5.0-Punkt-Version verwendet wird.

Der Standardwert hat sich 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 auf 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 geändert und die Leistungsauswirkungen mit sich gebracht hat.

7
jphofmann

Das Freigeben von Elementen ist eine Phase der Abfrageausführung, in der temporäre Strukturen, Puffer usw. freigegeben werden. In dieser Phase werden einige Abfrage-Cache-Arbeiten ausgeführt, aber das ist nicht das einzige, was dort passiert. Ich würde vorschlagen, SHOW-PROFILE zu verwenden, um zu sehen, wie lange diese Phase im Vergleich zu anderen Phasen dauert. Wenn die benötigte Zeit ein Problem darstellt, sollten Sie die Fehlerbehebung mit Tools wie dem Profiler und dem Profil eines armen Mannes durchführen.

5
Baron Schwartz

Es gab einen Fehlerbericht zu diesem Problem bezüglich "Freigeben von Elementen" und des Abfragecaches . Obwohl der Fehler 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 getwittert habe, weil der mehrfache InnoDB-Pufferpool von MySQL 5.5 eine Menge Thread-Sperren verursachte und ich vermutete, dass sich zwischengespeicherte Daten, die ich benötige, höchstwahrscheinlich auf mehrere Pufferpools verteilt hatten.

Er sagte mir deutlich, 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 den InnoDB-Speicher entscheiden lassen, wie viele innodb_concurrency_tickets selbst generiert werden sollen. Dies ist, was unendliche Parallelität tut.

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

3
RolandoMySQLDBA

Wir hatten ein Problem mit genau den gleichen Symptomen. Es stellte sich heraus, dass die Festplatte mit den InnoDB-Protokolldateien voll ist. Eine Überprüfung wert.

2
RedBlueThing

Ein weiterer 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 geleert, stattdessen bei jedem Commit ob. Leichte Beeinträchtigung der Datenintegrität, großer Geschwindigkeitsgewinn.

1
sto