2013-03-16 4 views
2

J'ai une installation mongodb (version: 2.0.8) sur une instance EC2 (7GB RAM) et la taille des données est toujours inférieure à 1GB. J'utilise le disque 100 IOPS provisionné pour améliorer les performances du disque.MongoDB requêtes lentes aléatoires - EC2 IOPS

Le problème est, je reçois un certain nombre de requêtes lentes aléatoires comme celui ci-dessous, (de journal mongo)

requête db.UserInfoShared: {_id: "999081873179"} ntoreturn: 1 idhack: 1 reslen: 108 1919ms

presque 2 secs! A pris

C'est juste une recherche _id sur une collection avec environ 100,000 entrées chacune moins de 500 bytes en taille. L'instance n'a que mongo en cours d'exécution et normalement ces recherches prennent moins de 0.01 sec.

Quelle pourrait être la cause de ce problème? que dois-je essayer de faire résoudre? Toute aide est très appréciée ...

+0

Pourrait-il y avoir d'autres opérations que vous effectuez sur le même processus mongod qui provoquent une lenteur globale? Il serait utile d'en voir plus dans votre fichier journal si cela est possible. En outre, vous devriez essayer Dex. Dex est un outil open-source qui examine vos requêtes lentes et recommande les index (http://mongolab.org/#view=dex). – angela

+0

En outre, vous devriez regarder les documents de notes de production pour MongoDB à http://docs.mongodb.org/manual/administration/production-notes/. Par exemple, vous devez monter votre volume en utilisant ext4 ou xfs et vous assurer que vous éteignez atime. – angela

+0

il ne fait aucun doute que cette requête utilise un index, donc Dex est peu susceptible d'aider. Cependant, la question de savoir ce que fait votre instance MongoDB est pertinente. Par exemple, faites-vous beaucoup d'écritures? Des requêtes lentes occasionnelles peuvent coïncider avec des bouffées de vaisselle. Vous pourriez obtenir une meilleure réponse avec (a) plus d'informations (b) en demandant cela sur les utilisateurs de MongoDB google group. –

Répondre

3

@angela, @Asya, merci beaucoup de m'avoir aidé. Il s'est avéré que la cause principale de la latence était mongodb GLOBAL LOCK lui-même. Nous avions un pourcentage de verrouillage qui était en moyenne de 5% et atteignait parfois 30 à 50%, ce qui entraîne des requêtes lentes. Si vous rencontrez ce problème, la première chose à faire est d'activer le service MMS de mongodb (mms.10gen.com), qui vous donnera beaucoup d'informations sur ce qui se passe exactement dans votre serveur db.

Dans notre cas, le pourcentage de VERROUILLAGE était vraiment élevé et il y avait plusieurs raisons à cela. La première chose que vous devez faire est de lire la documentation mongodb sur la concurrence, http://docs.mongodb.org/manual/faq/concurrency/

La raison du verrouillage peut être au niveau de l'application, mongodb ou du matériel.

1) Notre application faisait beaucoup de updates et chaque mise à jour (plus de 100 ops/sec) détient un global lock en mongodb. Le problème était que lorsqu'une mise à jour se produit pour une entrée qui n'est pas en mémoire, mongo devra d'abord charger les données dans la mémoire, puis les mettre à jour (en mémoire) et tout le processus se passe à l'intérieur du global lock. Si le tout prend 1 sec à compléter (0.75sec pour charger les données du disque et 0.25sec pour mettre à jour dans la mémoire), le reste des appels de mise à jour attend (pour l'ensemble 1 sec) et de telles mises à jour commence à se mettre en file d'attente ... vous remarquerez que les demandes ralentissent de plus en plus dans votre serveur d'applications.

La solution pour cela (bien que cela puisse paraître idiot) est de query pour les mêmes données avant de faire un update. Ce qu'il fait effectivement déplace les « données de charge à la mémoire » (0.75sec) part de l'global lock ce qui réduit considérablement votre lock percentage

2) L'autre cause principale de verrouillage global est les données de MongoDB flush sur le disque. Fondamentalement dans tous les 60sec (ou moins) mongodb (ou le système d'exploitation) écrit les données sur le disque et un global lock est tenue au cours de ce processus. (Ce genre explique les requêtes lentes aléatoires). Dans vos statistiques MMS, voir le graphique pour background flush avg ...Si c'est élevé, cela signifie que vous devez obtenir des disques plus rapides.

Dans notre cas, nous sommes passés à une nouvelle EBS optimized exemple dans EC2 et aussi cogné notre provisionné IOPS de 100 à 500 qui a presque réduit de moitié le background flush avg et les serveurs sont beaucoup plus heureux maintenant.

Questions connexes