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é?

Était-ce utile?

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

ActiveRecord a mis en commun les connexions de base de données depuis Rails 2.2, et il est probable que c'est ce qui cause vos connexions en trop ici. Essayez de baisser la valeur de pool dans votre database.yml pour cet environnement (valeur par défaut à 5).

Docs se trouve .

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top