mySQL « Trop de connexions » erreur influencée par nombre d'instances de batards?
-
24-10-2019 - |
Question
Récemment, j'ai commencé à obtenir mySQL « trop grand nombre de connexions » erreurs à des moments de forte affluence. Mes rails application fonctionne sur un cluster bâtarde avec 2 cas sur un hébergement mutualisé. Quelques changements récents qui pourraient être le conduire:
- Le trafic vers mon site a augmenté. je je suis maintenant en moyenne environ 4K pages une jour.
- taille de la base de données a augmenté. Ma plus grande table a des lignes ~ 100K. Certaines associations pourraient revenir plusieurs centaines de cas dans le pire des cas, même si la plupart sont beaucoup moins.
- J'ai ajouté quelques fonctionnalités augmenté le nombre et la taille appels de base de données dans certaines actions.
J'ai fait un examen de code pour réduire les appels de base de données, optimiser les requêtes SQL, ajouter des index manquants, et l'utilisation: inclure pour le chargement désireux. Cependant, beaucoup de mes méthodes font encore 5-10 appels SQL séparés. La plupart de mes actions ont un temps de réponse d'environ 100ms, mais un de mes actions les plus communes moyennes 300-400ms, et certaines actions de pointe au hasard à plus de 1000ms.
Les journaux sont de peu d'aide, comme les erreurs semblent se produire au hasard, ou tout au moins le motif ne semble pas lié aux actions appelés ou données accessibles.
Puis-je atténuer l'erreur en ajoutant des instances supplémentaires métissés? Ou sont les connexions mySQL limitées par le serveur, et donc sans rapport avec le nombre de processus que je partage mon trafic à travers?
Est-ce le plus probablement un problème avec mon codage, ou devrais-je pressera mon hôte pour une plus grande capacité / moins de charge sur le serveur partagé?
La solution
Êtes-vous quelque chose en mémoire cache? Il est une partie importante de la réduction de l'application et la charge de base de données. Rails guides ont une section sur la mise en cache .
Autres conseils
Quelque chose ne va pas. Une instance Mongrel traite 1 demande à un moment, donc si vous avez 2 cas Mongrel alors vous ne devriez pas voir plus de 2 connexions MySQL actives (des bâtards au moins)
Vous pouvez vous connecter ou représenter graphiquement la sortie SHOW STATUS LIKE 'Threads_connected' au fil du temps.
PS: ce n'est pas très nombreux bâtards. si vous voulez être en mesure de desservir plus de 2 requêtes simultanées alors vous voulez plus. ... si la mémoire est serré, vous pouvez passer à Phusion passagers et de terres rares.