2011-10-21 6 views
2

J'ai un ensemble de données simple, quelques collections, pas plus de 20 documents dans chacun, dans MongoDB 2.0 (précédemment 1.8). Je reçois pauvres résultats quand il s'agit de l'interrogation des données (au moins, je pense qu'ils pourraient être beaucoup mieux regarder http://mongoid.org/performance.html). Au début, je pensais que le mappeur que j'utilise dans Ruby (Mongoid) était le problème, mais j'ai fait d'autres tests et il semble plus lié à la base de données elle-même.MongoDB mauvaise performance de lecture

J'ai fait une référence simple où je fais une recherche du même document 10000 fois par son ID, en utilisant d'abord le pilote Ruby Mongo, puis MongoId. Les résultats :

   user  system  total  real 
driver 7.670000 0.380000 8.050000 ( 8.770334) 
mongoid 9.180000 0.380000 9.560000 (10.384077) 

Le code est ici: https://gist.github.com/1303536 La machine que je teste tout ceci est un Core 2 Duo P8400 2,27 GHz avec 4 Go de RAM sous Ubuntu 11.04. J'ai également fait un test similaire en utilisant pymongo pour vérifier si le problème réside dans le pilote Ruby, mais le résultat n'était que légèrement meilleur (5-6 s pour 10000 demandes).

Le bsonsize du document que je suis aller chercher est 67. Il a quelques petits documents intégrés, mais pas plus de 100. Certains des documents intégrés se réfèrent les documents provenant d'autres collections par ID, mais AFAIR cette relation est manipulé par le mappeur, il ne devrait donc pas influencer les performances . L'extraction de ce document directement dans la base de données avec explain() donne des résultats en millis = 0.

La chose étrange est que la LED du disque dur continue de clignoter tout le temps pendant les tests . Ce document ne devrait-il pas être mis en cache dans la RAM par Mongo après d'abord lu? Y at-il quelque chose d'évident que je pourrais manquer? Ou est-ce pas un mauvais résultat du tout (mais en comparant avec http://mongoid.org/performance.html il semble mauvais)?

+1

Il serait utile que vous partagiez tout votre code. En un coup d'oeil, il semble que vous faites beaucoup plus que simplement récupérer un tuple dans la boucle. D'une part, vous semblez sélectionner à plusieurs reprises la collection. –

+0

Quel code dois-je partager? Rejetons le test de Mongoid - ce n'est pas pertinent ici. Donc, tout le code est dans l'essentiel. La version Python est la même, je suppose, juste au cas où je le mettrais [ici] (https://gist.github.com/1303871). –

+0

Voyez-vous des fautes/sec dans votre course mongostat pendant ce temps? De toute façon, il y a beaucoup de raisons différentes pour lesquelles cela pourrait arriver. Essayez de réécrire votre test dans JSON/JS afin que même les personnes qui ne sont pas familières avec Mongoid puissent vous aider. –

Répondre

0

J'ai supprimé et recréé la base de données. Peut-être que c'était à cause de passer de 1.8 à 2.0. Quoi qu'il en soit, le disque dur a cessé de clignoter et tout est maintenant 2-3 fois plus rapide. J'ai également regardé attentivement le test qui a été utilisé pour comparer Mongoid et ce résultat (0.001s) est juste pour un find(), pas un million. J'ai dit à l'auteur de Mongoid que je ne pense pas qu'il soit clairement indiqué sur le site Web que le nombre d'opérations ne s'applique qu'à certains d'entre eux.

Désolé pour la confusion.

Questions connexes