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 top
commande, 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.)
lsb-release -a
etuname -a
s'il vous plaît)uname
mais je ne l'ai paslsb-release
installé.Réponses:
La taille de la mémoire résidente représente le nombre de pages en mémoire réellement touchées par le
mongod
processus. 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: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.
la source