我在 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
进程实际触及的内存页数。如果这明显低于可用内存,并且数据超过了可用内存(你的),那么可能只是还没有主动接触足够多的页面。
要确定是否是这种情况,您应该运行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 进程无关(因此不会被其触及)。这种差异的常见候选者是预读。我已经在其他地方详细介绍了该特定主题 ,因此如有必要,我将链接这两个答案以供将来阅读。
归档时间: |
|
查看次数: |
7445 次 |
最近记录: |