web-dev-qa-db-fra.com

Quelle raison pourrait provoquer un pic des connexions AWS RDS

C'est la première fois que j'utilise RDS sur AWS, j'utilise une instance t2.medium exécutant MySQL Aurora avec des configurations par défaut. L'utilisation du CPU et des connexions DB est tout à fait normale jusqu'à ce que "quelque chose" se produise, ce qui fait que les connexions DB vont jusqu'au maximum (avec t2.medium, c'est 80 connexions).

enter image description here

Je n'ai qu'une seule application Web, exécutée sur une instance EC2. Lorsque les connexions DB atteignent leur maximum, l'utilisation du processeur de l'instance EC2 est absolument normale (25-30%), mais toutes les tentatives de connexion à l'instance DB entraînent "Trop de connexions".

enter image description here

J'ai également vérifié l'utilisation du processeur de l'instance DB à l'époque - elle ne montrait aucun signal de charge élevée. Pendant le temps de frappe, l'utilisation du processeur est tombée à 20% et a maintenu ce taux de manière cohérente.

enter image description here

La chose que je ne comprends pas : les connexions DB sont à leur maximum, mais pourquoi l'utilisation du CPU DB est-elle abandonnée? Ne devrait-il pas être aussi à son maximum à cause du calcul des requêtes dans ces connexions?

Veuillez m'aider à comprendre, merci beaucoup.

(J'ai dû redimensionner l'instance RDS à r4.large lorsque la deuxième frappe se produit; je l'exécute toujours jusqu'à ce que je découvre le problème ...)

7
TrungDQ

Si vous exécutez show processlist; il vous montrera toutes les connexions qui s'exécutent sur votre base de données. Fonctionnement show status like 'Conn%' peut montrer combien de connexions sont actives

Vous pouvez penser qu'un nombre élevé de connexions augmenterait le processeur, mais en fin de compte, cela dépend de ce que ces connexions essaient d'accomplir, si elles ne font pas grand-chose mais empêchent votre application principale d'exécuter leurs connexions, le niveau de traitement normal sera descendre pendant que vous n'exécutez pas vos processus normaux

La chose ennuyeuse est de pouvoir exécuter la commande show processlist dont vous avez besoin pour être connecté à la base de données que vous ne pourrez pas utiliser lorsque vous êtes au maximum de connexions.

Un léger travail consiste à augmenter votre nombre maximal de connexions (si vous le pouvez) et à configurer une surveillance quelque part qui s'exécute de temps en temps (toutes les 5 minutes auraient détecté cela) et lorsque vous avez plus de 50 connexions, exécutez une commande qui vide toutes les connexions actives quelque part afin que vous puissiez les consulter plus tard.

4
Ste Bov

Dans votre RDS, vérifiez d'abord toutes les métriques IOPS.

RDS fournit une certaine quantité d'IOPS, et si votre instance RDS possède un SSD de 10 Go, votre quantité d'IOPS est probablement de 100 IOPS (par défaut), cette augmentation de valeur dépend de la taille du SSD de l'instance.

Si vous n'avez pas assez d'IOPS, votre RDS est bloqué pour les opérations IO, provoquant l'envoi de données dans votre MySQL et des délais d'attente élevés, mais aucun changement d'utilisation du processeur ou de la mémoire, car il s'agit d'un problème de disque .

Pour le corriger, changez les configurations de MySQL, dans Dashboard vous le changez.

J'ai MySQL sur l'instance EC2, à faible coût pour moi.

Voir my.cnf

[mysqld]


port                           = 3306
user                           = mysql
default-storage-engine         = InnoDB
socket                         = /var/lib/mysql/mysql.sock
pid-file                       = /var/lib/mysql/mysql.pid


log-error                      = /var/lib/mysql/mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 0
slow-query-log-file            = /var/lib/mysql/mysql-slow.log
log_error_verbosity            = 2


max-allowed-packet              = 6M
skip-name-resolve
sql-mode                        = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
sysdate-is-now                  = 1



datadir                         = /var/lib/mysql


key-buffer-size                 = 128M
query_cache_size                = 128M #100M384M

tmp_table_size                  = 256M
max_heap_table_size             = 256M

innodb-buffer-pool-size         = 2G 
innodb_log_buffer_size          = 8M
innodb_log_file_size            = 1G


wait_timeout                    = 10
interactive_timeout             = 300


max-connect-errors              = 100000
max-connections                 = 200


sort_buffer_size                = 4M
read_buffer_size                = 2M
read_rnd_buffer_size            = 2M
join_buffer_size                = 2M
thread_stack                    = 4M
thread-cache-size               = 80


performance_schema              = on


query_cache_type                = 1 #0 #1
query_cache_limit               = 128M


table_open_cache                = 2680
open-files-limit                = 1024000
table-definition-cache          = 3024



# IOPS OPTIMIZATION #

innodb-flush-method            = O_DIRECT
innodb-log-files-in-group      = 2
innodb-flush-log-at-trx-commit = 2

innodb_buffer_pool_instances   = 1
innodb_stats_on_metadata       = 0

innodb_io_capacity             = 100
innodb_use_native_aio          = 1
innodb-file-per-table          = 0

explicit_defaults_for_timestamp = 1

[Cette conf est pour 2 vcpu et 4 Go de RAM, 10 Go de SSD avec 100 IOPS] Fonctionne très bien pour moi dans AWS NLB + Auto Scaling Service.

D'autres optimisations seraient augmentées le tampon innodb à 50% de la mémoire de l'instance et innodb_log_file_size avec 50% de la valeur innodb-buffer-pool-size.

Lisez ceci: https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-diskio.html

J'espère vous aider ou aider d'autres utilisateurs avec le même problème. =)

5
Gustavo alves