Frage Welchen Wert von thread_cache_size sollte ich verwenden?


Ich benutze Asp.Net zusammen mit MySQL. In der .Net-Verbindungszeichenfolge habe ich Max Pool Size auf 150 festgelegt.

Wenn ich folgendes führe, bekomme ich folgende 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

Das gibt Threads_created / Connections = 0,1392.

Von daher scheint es, als müsste ich erhöhen thread_cache_size.

Aber wenn ich renne SHOW PROCESSLIST Ich sehe immer, dass ich viele Verbindungen geöffnet habe (die meisten von ihnen schlafen), weil der Pool von .Net erstellt wurde. Muss ich noch einstellen? thread_cache_size wie werde ich immer noch die Verbindungen aus dem Verbindungspool wiederverwenden? Wenn die Poolgröße 150 ist, denken Sie, dass ein guter Wert gesetzt werden würde thread_cache_size bis 150+? Würde dies CPU und Speicher stark beeinträchtigen?


24
2017-07-18 13:37


Ursprung




Antworten:


Basierend auf den Informationen in der MySQL-Dokumentation sollten Sie Folgendes tun: Finden Sie heraus, wie viele Verbindungen mysqld gleichzeitig hat Verbindungen, Threads_created, und Max_used_connections,

  • 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 das über 0,01 ist, dann erhöhen thread_cache_size. Zumindest, thread_cache_size sollte größer sein als Max_used_connections.


39
2017-07-18 18:08



Danke für den tollen Kommentar! Ich habe meine Frage ein wenig aktualisiert. - Martin
Ich denke, Sie wollten MySQL> SHOW GLOBAL STATUS LIKE 'Verbindungen'; (Sie haben max_used_connections zweimal geschrieben) - Alekc
Ich möchte das nur hinzufügen, indem ich darauf Bezug nehme dev.mysql.com/doc/refman/5.7/de/... Sie sollten 8 zu Max_used_connections für den Wert thread_cache_size hinzufügen (ohne 100 zu überschreiten) - CME64
Eigentlich schlägt das Handbuch einen Standardwert von (1% der mac_used_connections) + 8 .... oder 100 vor ... was auch immer weniger ist. - Christopher McGowan
Für mich sind die # 264/103134, die zu 0.0026 funktioniert, die viel weniger als 0.01 ist. Aber meine MaxUsedConnections ist 72, so ist der letzte Satz schrecklich widersprüchlich - boatcoder


Laut den MySQL-Dokumenten sollten Sie festlegen thread_cache_size Daher verwenden die meisten neuen Verbindungen Threads aus dem Cache und nicht neu erstellte Threads. Dies spart einen gewissen Mehraufwand bei der Thread-Erstellung, obwohl normalerweise keine signifikante Leistungsverbesserung erzielt wird:

Anforderungen für Threads werden erfüllt, indem Threads aus dem Thread wiederverwendet werden   Cache, wenn möglich, und nur wenn der Cache leer ist, ist ein neuer Thread   erstellt. Diese Variable kann erhöht werden, um die Leistung zu verbessern, wenn Sie   habe viele neue Verbindungen. Normalerweise liefert dies kein a   bemerkenswerte Leistungsverbesserung wenn du einen guten Thread hast   Implementierung. Wenn Ihr Server jedoch Hunderte von Verbindungen erkennt   pro Sekunde solltest du thread_cache_size normalerweise so hoch setzen   Das Die meisten neuen Verbindungen verwenden zwischengespeicherte Threads. (Quelle)

Dies würde bedeuten, dass Sie Ihre festlegen sollten thread_cache_size damit 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. RolandoMySQLDBA's Antwort sagt <1%. Ich weiß nicht, wer näher an der Wahrheit ist.

Du solltest nicht einstellen thread_cache_size höher als Max_used_connections. Der letzte Satz in der RolandoMySQLDBA-Antwort ("Zumindest thread_cache_size sollte größer als Max_used_connections sein") erscheint nicht sinnvoll, da er besagt, dass Sie mehr Threads im Cache als Ihr Server behalten sollten je Verwendet. MySQL wird sowieso nie so viele Threads in den Cache stellen - es legt Threads nicht präventiv in den Cache - es legt sie nur dort hin nach dem Ein Client erstellt einen Thread und trennt die Verbindung. Wenn Sie niemals X-Clients zur gleichen Zeit verbinden, werden Sie niemals X-Threads im Cache haben:

Wenn ein Client die Verbindung trennt, werden die Threads des Clients in den Cache gestellt   wenn es weniger als thread_cache_size threads gibt. (Quelle)

Siehe auch diese Antwort von Michael:

Das Festlegen von thread_cache_size auf einen Wert größer als max_connections scheint   wie ungeheuer wenig hilfreicher Rat ... der Cache kann unmöglich wachsen   größer als max_connections und sogar ein Cache irgendwo in der Nähe   Größe kann nur sinnvoll sein, wenn Sie eine enorme Menge an Abwanderung haben   deine Fäden ... die, in einer wohlerzogenen Anwendung, nicht die sein werden   Fall.

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


9
2017-10-16 06:42



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


Benötigt ein "Neuvermieter" am gemeinsamen Arbeitstag möglicherweise eine Verbindung? Die meisten Magier 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 ein gutes CAP.

Sehen Sie diesen Link bitte.

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

-2
2017-10-09 18:37