Welchen Wert von thread_cache_size soll ich verwenden?

25

Ich benutze Asp.Net zusammen mit MySQL. In der .Net-Verbindungszeichenfolge habe ich die maximale Poolgröße auf 150 festgelegt.

Wenn ich Folgendes ausführe, erhalte ich diese Werte:

SHOW GLOBAL STATUS LIKE 'max_used_connections'; gives 66
SHOW GLOBAL STATUS LIKE 'Threads_created'; gives 66
SHOW GLOBAL STATUS LIKE 'connections'; gives 474

Was gibt Threads_created / Connections = 0,1392.

Von daher scheint es, als müsste ich zunehmen thread_cache_size.

Aber wenn ich laufe, SHOW PROCESSLISTsehe ich immer, dass viele Verbindungen offen sind (die meisten schlafen), weil der Pool von .Net erstellt wurde. Muss ich immer noch das einstellen, thread_cache_sizeda ich die Verbindungen aus dem Verbindungspool immer noch wiederverwenden werde? Wenn die Poolgröße 150 ist, ist es Ihrer Meinung nach ein guter Wert thread_cache_size, 150+ festzulegen? Würde dies die CPU und den Speicher stark beeinträchtigen?

Martin
quelle

Antworten:

43

Anhand der Informationen in der MySQL-Dokumentation sollten Sie Folgendes tun: Ermitteln Sie, wie viele gleichzeitige Verbindungen mysqld mit Connections , Threads_created und Max_used_connections am häufigsten hatte.

  • SHOW GLOBAL STATUS LIKE 'Connections';
  • SHOW GLOBAL STATUS LIKE 'Threads_created';
  • SHOW GLOBAL STATUS LIKE 'Max_used_connections';

Versuchen Sie Folgendes zu berechnen

Threads_created / Connections: Wenn dieser Wert über 0,01 liegt, erhöhen Sie ihn thread_cache_size. Zumindest thread_cache_sizesollte größer sein als Max_used_connections.

RolandoMySQLDBA
quelle
Danke für den tollen Kommentar! Ich habe meine Frage ein wenig aktualisiert.
Martin
Ich denke, Sie wollten mysql> SHOW GLOBAL STATUS LIKE 'connections'. (Sie haben max_used_connections zweimal geschrieben)
Alekc
1
Ich möchte nur hinzufügen, dass Sie unter Bezugnahme auf diese dev.mysql.com/doc/refman/5.7/en/… 8 zu Max_used_connections für den thread_cache_size-Wert hinzufügen sollten (ohne 100 zu überschreiten)
CME64
1
Tatsächlich schlägt das Handbuch einen Standardwert von (1% der mac_used_connections) + 8 ... oder 100 ... vor, je nachdem, welcher Wert geringer ist.
Christopher McGowan
Für mich sind die # 264/103134, was 0,0026 ergibt, was weit weniger als 0,01 ist. Aber meine MaxUsedConnections sind 72, so dass der letzte Satz fürchterlich in Konflikt gerät
boatcoder
11

Gemäß den MySQL-Dokumenten sollten Sie festlegen thread_cache_size, dass die meisten neuen Verbindungen Threads aus dem Cache anstelle von neu erstellten Threads verwenden. Dies spart einen gewissen Aufwand bei der Thread-Erstellung, führt jedoch normalerweise nicht zu einer signifikanten Leistungsverbesserung:

Anforderungen für Threads werden erfüllt, indem aus dem Cache entnommene Threads nach Möglichkeit wiederverwendet werden. Nur wenn der Cache leer ist, wird ein neuer Thread erstellt. Diese Variable kann erhöht werden, um die Leistung zu verbessern, wenn Sie viele neue Verbindungen haben. Normalerweise bietet dies keine nennenswerte Leistungsverbesserung, wenn Sie eine gute Thread-Implementierung haben. Wenn Ihr Server jedoch Hunderte von Verbindungen pro Sekunde sieht, sollten Sie normalerweise thread_cache_size so hoch einstellen, dass die meisten neuen Verbindungen zwischengespeicherte Threads verwenden . (Quelle)

Dies würde bedeuten, dass Sie Ihr thread_cache_sizeso einstellen sollten Threads_created / Connections(der Prozentsatz der Verbindungen, die zur Erstellung neuer Threads führen), ist eher gering. Wenn Sie die MySQL-Dokumente wörtlich nehmen ("die meisten"), sollte der Wert <50% sein. Die Antwort von RolandoMySQLDBA lautet <1%. Ich weiß nicht, wer der Wahrheit näher ist.

Sie sollten nichtthread_cache_size höher als einstellen Max_used_connections. Der letzte Satz in RolandoMySQLDBAs Antwort ("Zumindest sollte thread_cache_size größer sein als Max_used_connections") erscheint nicht sinnvoll, da er besagt, dass Sie mehr Threads im Cache behalten sollten, als Ihr Server jemals verwendet. MySQL legt sowieso nie so viele Threads im Cache ab - Threads werden nicht präventiv im Cache abgelegt - sie werden erst dort abgelegt, nachdem ein Client einen Thread erstellt und die Verbindung getrennt hat. Wenn Sie niemals X-Clients gleichzeitig verbinden, befinden sich niemals X-Threads im Cache:

Wenn ein Client die Verbindung trennt, werden die Threads des Clients in den Cache gestellt, wenn dort weniger als thread_cache_size-Threads vorhanden sind. (Quelle)

Siehe auch diese Antwort von Michael:

Thread_cache_size auf einen Wert größer als max_connections zu setzen, scheint ein äußerst wenig hilfreicher Rat zu sein ... der Cache kann möglicherweise nicht größer als max_connections werden, und selbst ein Cache in der Nähe dieser Größe kann nur dann sinnvoll sein, wenn Ihre Threads über eine enorme Menge an Churn verfügen ... was in einer gut erzogenen Anwendung nicht der Fall sein wird.

https://dba.stackexchange.com/a/28701

Tomasz P. Szynalski
quelle
Ich glaube schon! Nachdem ich diese Konfiguration getestet habe, sollte "thread_cache_size größer als Max_used_connections" nicht hilfreich sein.
CK.Nguyen
-2

Würde ein „neuer Mitarbeiter“ im normalen Arbeitsalltag möglicherweise eine Verbindung benötigen? Die meisten Zauberer werden nicht wissen, wie viele Leute in den nächsten Tagen eingestellt werden könnten. V 8 von MySQL schlägt CAP thread_cache_size bei 100 vor, um eine Überlastung unabhängig von max_used_connections zu verhindern. Für mich ist 100 eine gute GAP.

Bitte sehen Sie diesen Link.

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_thread_cache_size
Wilson Hauck
quelle