MongoDB 未使用所有可用 RAM

Chr*_* W. 9 mongodb memory

我在 mongo 集群中存储了大约 200 GB 的数据。运行 mongo 的实例之一上的物理内存为 8GB。在此实例上不会运行任何其他任何后果。根据 Mongo 的文档(例如:http : //www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage),我可以理解的尽可能接近,这意味着 mongod 进程应该使用大约 100% 的可用的物理内存。但是,如果您查看top命令的以下输出,您将看到 mongod 实例仅使用 2GB 的常驻内存,并且有完整的 2GB 可用物理内存,但根本没有使用。

有人可以向我解释这种行为吗?为什么有 2GB 的空闲内存?

top 输出:

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
 ...
Run Code Online (Sandbox Code Playgroud)

系统信息:

$ uname -a
Linux aluminum 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 该集群中还有另一个实例,其中 mongod 的行为符合我的预期并利用了所有可用内存。
  • 查看 mongostat 似乎一直有一些页面错误,因此使用的内存量应该会增加:
  • (我在 mongodb-user google group 上问了同样的问题,但没有得到回应。)

Ada*_*m C 5

常驻内存大小表示mongod进程实际触及的内存页数。如果这明显低于可用内存,并且数据超过了可用内存(你的),那么可能只是还没有主动接触足够多的页面。

要确定是否是这种情况,您应该运行free -m,输出应如下所示:

free -m
             total       used       free     shared    buffers     cached
Mem:          3709       3484        224          0         84       2412
-/+ buffers/cache:        987       2721
Swap:         3836        156       3680
Run Code Online (Sandbox Code Playgroud)

在我的例子中,cached 并不接近总数,这意味着 mongod 不仅没有接触到足够多的页面,文件系统缓存甚至还没有被从磁盘读取的页面填满。

对此的快速补救措施是touch 命令(在 2.2 中添加) - 在大型数据集上应谨慎使用,因为即使数据太大而无法容纳(导致大量数据),它也会尝试将所有内容加载到 RAM 中磁盘 IO 和页面错误)。不过,它肯定会有效地填满内存:)

如果您的缓存值接近可用总数,那么您的问题是从磁盘读入内存的大量页面与 mongod 进程无关(因此不会被其触及)。这种差异的常见候选者是预读。我已经在其他地方详细介绍了该特定主题 ,因此如有必要,我将链接这两个答案以供将来阅读。