内存分配策略:
内存 > 索引 + 热数据 + 连接数*Stack(ulimit -a | grep stack ),另外,操作系统本身正常运转也需要消耗一部分内存
虚拟内存大小限制
# 查看
shell> ulimit -a | grep 'virtual'
# 关闭,避免OOM
shell> ulimit -v unlimited
连接占用内存
# 查看当前连接数
mongo> db.serverStatus().connections
每个连接默认分配内存为Stack
# 查看Linux下缺省的Stack
shell> ulimit -a | grep stack
stack size (kbytes, -s) 10240
# 设置Stack
# 注:ulimit的使用是有上下文的,最好放在MongoDB的启动脚本里。
shell> ulimit -s 1024
查看数据、索引大小
mongo> db.stats()
{
"dataSize" : 1004862191980,
"indexSize" : 1335929664
}
内存释放
重启服务
内置closeAllDatabases命令
mongo> use adminmongo> db.runCommand({closeAllDatabases:1})
调整内核参数drop_caches
shell> sysctl -w vm.drop_caches=1
内存监控使用情况
mongo命令行
mongo> db.serverStatus().mem:{"resident" : 22346,"virtual" : 1938524,"mapped" : 962283}
mongostat命令
shell> mongostatmapped vsize res faults940g 1893g 21.9g 0
其中内存相关字段的含义是:mapped:映射到内存的数据大小visze:占用的虚拟内存大小res:占用的物理内存大小注:如果操作不能在内存中完成,结果faults列的数值不会是0,视大小可能有性能问题。在上面的结果中,vsize是mapped的两倍,而mapped等于数据文件的大小,所以说vsize是数据文件的两倍之所以会这样,是因为本例中,MongoDB开启了journal,需要在内存里多映射一次数据文件,如果关闭journal,则vsize和mapped大致相当。如果想验证这一点,可以在开启或关闭journal后,通过pmap命令来观察文件映射情况:shell> pmap $(pidof mongod)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26250550/viewspace-1821314/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26250550/viewspace-1821314/