J'utilise Asp.Net avec MySQL. Dans la chaîne de connexion .Net, j'ai défini la taille maximale du pool sur 150.
Si j'exécute ce qui suit, j'obtiens ces valeurs:
SHOW GLOBAL STATUS LIKE 'max_used_connections'; gives 66
SHOW GLOBAL STATUS LIKE 'Threads_created'; gives 66
SHOW GLOBAL STATUS LIKE 'connections'; gives 474
Ce qui donne Threads_created/Connections = 0,1392.
Donc, à partir de là, il semble que je doive augmenter thread_cache_size
.
Mais si je lance SHOW PROCESSLIST
Je vois toujours que j'ai beaucoup de connexions ouvertes (la plupart dormant) à cause du pool créé par .Net. Dois-je encore définir le thread_cache_size
car je vais encore réutiliser les connexions du pool de connexions? Si la taille de la piscine est de 150, pensez-vous qu'une bonne valeur serait de définir thread_cache_size
à 150+? Cela affecterait-il beaucoup le processeur et la mémoire?
Sur la base des informations de la documentation MySQL, vous devez procéder comme suit: Découvrez le nombre le plus élevé de connexions simultanées que mysqld a eu en utilisant Connexions , Threads_created , et Max_used_connections ,
SHOW GLOBAL STATUS LIKE 'Connections';
SHOW GLOBAL STATUS LIKE 'Threads_created';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
Essayez de calculer les éléments suivants
Threads_created / Connections
: Si cela dépasse 0,01, augmentez thread_cache_size
. Tout au moins, thread_cache_size
doit être supérieur à Max_used_connections
.
Selon les documents MySQL, vous devez définir thread_cache_size
afin que la plupart des nouvelles connexions utilisent des threads du cache plutôt que des threads nouvellement créés. Cela permet d'économiser certains frais généraux de création de threads, bien que cela ne crée normalement pas d'amélioration significative des performances:
Les demandes de threads sont satisfaites en réutilisant les threads extraits du cache si possible, et ce n'est que lorsque le cache est vide qu'un nouveau thread est créé. Cette variable peut être augmentée pour améliorer les performances si vous avez beaucoup de nouvelles connexions. Normalement, cela n'apporte pas une amélioration notable des performances si vous avez une bonne implémentation du thread. Cependant, si votre serveur voit des centaines de connexions par seconde, vous devez normalement définir thread_cache_size suffisamment haut pour que la plupart des nouvelles connexions utilisent des threads mis en cache. (source)
Cela signifie que vous devez définir votre thread_cache_size
pour que Threads_created / Connections
(le% de connexions qui conduisent à la création de nouveaux threads) est plutôt faible. Si vous prenez les documents MySQL littéralement ("la plupart"), la valeur doit être <50%. La réponse de RolandoMySQLDBA indique <1%. Je ne sais pas qui est le plus proche de la vérité.
Vous ne devez pas définir thread_cache_size
plus haut que Max_used_connections
. La dernière phrase de la réponse de RolandoMySQLDBA ("À tout le moins, thread_cache_size devrait être supérieure à Max_used_connections") ne semble pas sensée car elle dit que vous devez garder plus de threads dans le cache que votre serveur jamais = utilise. MySQL ne mettra jamais autant de threads dans le cache de toute façon - il ne place pas de manière préventive les threads dans le cache - il ne les place que là après un client crée un thread et se déconnecte. Si vous n'avez jamais X clients connectés en même temps, vous n'aurez jamais X threads dans le cache:
Lorsqu'un client se déconnecte, les threads du client sont placés dans le cache s'il y a moins de threads thread_cache_size. (source)
Voir aussi cette réponse par Michael:
Définir thread_cache_size à une valeur supérieure à max_connections semble être un conseil extrêmement inutile ... le cache ne peut pas devenir plus grand que max_connections et même un cache n'importe où proche de cette taille ne pourrait avoir de sens que si vous avez une énorme quantité de désabonnement sur vos threads ... ce qui, dans une application bien comportée, ne sera pas le cas.