MongoDB n'utilise pas toute la RAM disponible

9

J'ai quelque chose d'environ 200 Go de données stockées dans un cluster mongo. La mémoire physique sur l'une des instances exécutant mongo est de 8 Go. Rien d'autre de n'importe quelle conséquence ne s'exécute sur cette instance. D'après ce que je peux comprendre d'après les documents de Mongo (comme celui-ci: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ), cela signifie que le processus mongod devrait utiliser environ 100% de la mémoire physique disponible. Mais si vous regardez la sortie suivante de la topcommande, vous verrez que l'instance mongod n'utilise que 2 Go de mémoire résidente et qu'il y a 2 Go de mémoire physique libre disponible qui n'est pas du tout utilisée.

Quelqu'un peut-il m'expliquer ce comportement? Pourquoi y a-t-il 2 Go de mémoire libre?

top production:

top - 23:19:43 up 89 days, 20:05,  2 users,  load average: 0.41, 0.55, 0.59
Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.0%us,  1.3%sy,  0.0%ni, 93.9%id,  2.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8163664k total,  6131764k used,  2031900k free,    54976k buffers
Swap: 16771848k total,    10604k used, 16761244k free,  5367700k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                             
 1401 mongodb   20   0  174g 2.0g 1.9g S   23 26.2  18070:55 mongod
 ...

Information système:

$ uname -a
Linux aluminum 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux

Remarques:

  • Il y a une autre instance dans ce cluster où mongod se comporte comme je m'y attendais et utilise toute la mémoire disponible.
  • En regardant Mongostat, il semble qu'il y ait toujours des défauts de page, donc la quantité de mémoire utilisée devrait augmenter:
  • (J'ai posé cette même question sur le groupe google mongodb-user mais je n'ai reçu aucune réponse.)
Chris W.
la source
Quelle distribution Linux? Est-ce 32 ou 64 bits? (Modifiez votre question avec la sortie de lsb-release -aet uname -as'il vous plaît)
Philᵀᴹ
Merci. Ajouté unamemais je ne l'ai pas lsb-releaseinstallé.
Chris W.
Avez-vous accidentellement téléchargé la version 32 bits de MongoDB? La taille maximale d'une instance Mongo 32 bits est de 2 Go.
Aaron
@ BryceAtNetwork23 nope; nous avons certainement plus de 2 Go dans notre mongodb total (plusieurs centaines de concerts en fait).
Chris W.
@ChrisW il signifie la taille maximale de la mémoire - pas la taille de la base de données. Et cela semble bien expliquer le 2 Go.
rfusca

Réponses:

5

La taille de la mémoire résidente représente le nombre de pages en mémoire réellement touchées par le mongodprocessus. Si cela est nettement inférieur à la mémoire disponible et que les données dépassent la mémoire disponible (la vôtre le fait), cela peut simplement être dû au fait que vous n'avez pas encore touché suffisamment de pages.

Pour déterminer si c'est le cas, vous devez exécuter free -m, la sortie devrait ressembler à ceci:

free -m
             total       used       free     shared    buffers     cached
Mem:          3709       3484        224          0         84       2412
-/+ buffers/cache:        987       2721
Swap:         3836        156       3680

Dans mon exemple, la mise en cache n'est pas proche du total, ce qui signifie que non seulement mongod n'a pas touché suffisamment de pages, le cache du système de fichiers n'a même pas encore été rempli par les pages lues sur le disque en général.

Un remède rapide à cela serait la commande tactile (ajoutée en 2.2) - elle doit être utilisée avec prudence sur les grands ensembles de données car elle tentera de tout charger dans la RAM même si les données sont beaucoup trop volumineuses pour tenir (provoquant beaucoup de IO disque et défauts de page). Cela remplira certainement la mémoire efficacement :)

Si votre valeur en cache est proche du total disponible, votre problème est qu'un grand nombre de pages lues en mémoire à partir du disque ne sont pas pertinentes (et donc pas touchées) par le processus mongod. Le candidat habituel pour ce type de divergence est la lecture anticipée. J'ai déjà couvert ce sujet particulier ailleurs en détail, donc je vais simplement relier ces deux réponses pour une lecture future si nécessaire.

Adam C
la source