web-dev-qa-db-fra.com

Pourquoi le statut max_used_connections n'est-il pas actualisé automatiquement une fois qu'il a atteint max_connections, même si les threads_connected tombent

Je me demande toujours, pourquoi le max_used_connections la valeur n'est pas descendue, une fois qu'elle atteint la valeur maximale de max_connections?

J'ai toujours rincé le statut et aboutissez cette valeur pour éviter que la connexion DB a refusé des erreurs et des messages d'avertissement dans le journal des erreurs:

=====
121112 14:04:36 [Warning] Too many connections
121112 14:04:36 [Warning] Too many connections
121112 14:04:36 [Warning] Too many connections
121112 14:04:36 [Warning] Too many connections
121112 14:04:36 [Warning] Too many connections
121112 14:04:36 [Warning] Too many connections
121112 14:04:36 [Warning] Too many connections
=======
mysql> select version();show variables like "%max_connections%";show global status 
         like "%Max_used%";show status like "%thread%";
            +--------------+
            | version()    |
            +--------------+
            | 5.1.52-2-log |
            +--------------+
            1 row in set (0.00 sec)

            +-----------------+-------+
            | Variable_name   | Value |
            +-----------------+-------+
            | max_connections | 150   |
            +-----------------+-------+
             1 row in set (0.00 sec)

            +----------------------+-------+
            | Variable_name        | Value |
            +----------------------+-------+
            | Max_used_connections | 151   |
            +----------------------+-------+
            1 row in set (0.00 sec)

            +----------------------------+-------+
            | Variable_name              | Value |
            +----------------------------+-------+
            | Com_show_thread_statistics | 0     |
            | Delayed_insert_threads     | 0     |
            | Slow_launch_threads        | 0     |
            | Threads_cached             | 89    |
            | Threads_connected          | 2     |
            | Threads_created            | 1344  |
            | Threads_running            | 2     |
            +----------------------------+-------+
            7 rows in set (0.00 sec)
mysql> show variables like "%thread_cache%";
            +-------------------+-------+
            | Variable_name     | Value |
            +-------------------+-------+
            | thread_cache_size | 90    |
            +-------------------+-------+
            1 row in set (0.00 sec)

Voici le statut de connexion avorté:

mysql> show global status like "%Aborted%";
            +------------------+----------+
            | Variable_name    | Value    |
            +------------------+----------+
            | Aborted_clients  | 119      |
            | Aborted_connects | 43855304 |
            +------------------+----------+
            2 rows in set (0.00 sec)
  1. J'ai observé dans certains scénarios que le max_used_connections La valeur est descendue de manière dynamique, une fois que le threads_connected tombe par terre.

  2. Est-ce seulement une variable d'indication pour augmenter la max_connections? Poster cette requête pour une meilleure compréhension. Des explications détaillées s'il vous plaît?

J'ai lu quelque part thread_cache_size devrait être plus grand que max_connections, quel sera l'impact si c'est moins?

max_used_connections

Le nombre maximum de connexions utilisées simultanément depuis le démarrage du serveur.

7
Gopinath

Cela ne tombe pas parce que ce n'est pas censé descendre.

Max_used_connections est une variable d'état, et est définie comme "le maximum Nombre de connexions qui ont été utilisés simultanément depuis le début du serveur. "

Il s'avère, vous pouvez également réinitialiser la valeur au nombre actuel de connexions à l'aide de FLUSH STATUS.

Mais ce n'est pas une "solution partielle" à quoi que ce soit parce que cela ne change rien. La seule chose que vous accomplissez avec FLUSH STATUS est une sorte de baselining la valeur d'une variable d'état de l'information uniquement: Réinitialisation de la valeur que vous voyez, jusqu'à la valeur actuelle de la variable d'état Threads_connected - Le nombre actuel de connexions.

Cette action ne change rien sur le comportement du serveur. Si vous voyez un changement de comportement après cela, c'est une coïncidence.

mysql> SHOW STATUS LIKE 'Threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 225   |
+-------------------+-------+
1 row in set (0.00 sec)

Ce qui précède serait une valeur plus utile pour que vous surveilliez, tout en dépannage. Il montre le nombre actuel.

Mais aborder votre problème, vous avez une application qui ne relâche pas correctement ses connexions - ce qui doit être réparé ailleurs, pas dans MySQL - ou vous pouvez avoir raison - vous devez augmenter la valeur de la max_connections variable globale - Après avoir examiné ce qui est écrit C.5.2.7 Trop de connexions . Cette page explique également pourquoi votre sortie ci-dessus montre une Max_used_connections de 151 par rapport à max_connections de 150.

Réglage thread_cache_size à une valeur supérieure à max_connections semble être un conseil énormément inutile ... Le cache ne peut pas éventuellement devenir plus grand que max_connections Et même une cache n'importe où près de cette taille ne pouvait que donner un sens si vous avez une quantité énorme de baratte de votre threads ... qui, dans une application bien élevée, ne sera pas le cas.

9
Michael - sqlbot