mongodb属于常用内存数据库库吗

MongoDB 内存使用情况分析
字体:[ ] 类型:转载 时间:
都说 MongoDB 是个内存大户,但是怎么知道它到底用了多少内存呢
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。先 ps 一下看看。
代码如下:$ ps aux|grep mongodmongo&&& 2 20.0 243052 ?& Sl&& May16 117:03 /path/to/mongodb/bin/mongod
总共 760G 多的虚拟内存,但是物理内存就只有 12.6G 。这个机器可是有 64G 内存的哦,这看起来 MongoDB 完全没用多少内存嘛。
再看看 free 的结果。
代码如下:$ free -m&&&&&&&&&&&& total&&&&&& used&&&&&& free&&&& shared&&& buffers&&&& cachedMem:&&&&&&&& 64544&&&&& 64279&&&&&&& 265&&&&&&&&& 0&&&&&&& 134&&&&& 60413-/+ buffers/cache:&&&&&& 3731&&&&& 60813Swap:&&&&&&& 31999&&&&&&&&& 0&&&&& 31999
内存倒是占得差不多了,基本都是 cached ,也就是文件系统缓存。MongoDB 是通过 mmap 方式让操作系统来处理持久化和缓存的。每个数据文件都直接映射到某个虚拟内存地址。访问的时候如果这一页不在内存中,系统就会尝试把这一页加载进来。这些内存都是算进 cache 里的。在 mongodb 的官方文档里有这样一个说法,top 或 ps 里的 RSIZE 段显示的是机器的全部内存大小,因为 mongodb 会尽可能占用全部内存。但是事实上,这些缓存并没有算在里面。因此在 top 或 ps 中是看不出 MongoDB 的实际内存使用情况的。而 free 虽然可以看到系统的内存使用情况,但是没法确定这些内存里究竟有多少真的是 MongoDB 使用的。
还好有人做了 vmtouch 这个工具。可以检查文件在缓存中的情况,另外也可以把文件直接加载进缓存或者踢出去。只需要对 MongoDB 的所有数据文件检查一下缓存加载情况,就可以知道 MongoDB 到底缓存了多少数据了。
代码如下:$ vmtouch -m4G /path/to/mongodb/data/&&&&&&&&&& Files: 256&&&& Directories: 3& Resident Pages: G/382G& 15.4%&&&&&&&& Elapsed: 4.072 seconds
这里 -m4G 是 vmtouch 检查的文件大小限制。MongoDB 的数据文件比较大,通常会超过默认的 500M。这样看来,缓存用了 58G,这还差不多。Resident Pages 左侧的数字是页的数量,页的数量乘以文件系统页大小才是内存使用量。页的大小可以通过
代码如下:getconf PAGESIZE
查看,通常是 4096,也就是 4KB。
MongoDB 在 NUMA 的机器上运行,并且内存被固定到一个 node 的时候,会有一个警告
代码如下:WARNING: You are running on a NUMA machine. We suggest launching mongod like this to avoid performance problems: numactl –interleave=all mongod [other options]
也许是认为,这种情况下只能用上一个节点的内存。但 MongoDB 的缓存是由操作系统管理的。NUMA 似乎对此并没有影响。而内存不太小的时候 MongoDB 本身很难用掉一个节点的内存。这种情况下,是否开启 numactl –interleave=all 作用已经不大了。能做的也许只能是加内存,sharding,或者换 ssd 了。
出处:/2013/05/mongodb-%e5%86%85%e5%ad%98%e4%bd%bf%e7%94%a8.html
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具后使用快捷导航没有帐号?
查看: 8478|回复: 21
谁能说说mangodb 和 hbase的区别?
金牌会员, 积分 1770, 距离下一级还需 1230 积分
论坛徽章:2
谁能说说mangodb 和 的区别?
或者mangodb 可否集成到中?
注册会员, 积分 167, 距离下一级还需 33 积分
论坛徽章:1
两者的区别主要在于:
1、HBase依赖于HDFS;MongoDB直接存储在本地磁盘中
2、HBase按照列族将数据存储在不同的文件中;MongoDB不分列,整个文档都存储在一个(或者说一组)文件中,通过一个有一个通用的.ns文件保存名称空间(Column-based和Document-Based之间的区别应该是指这个地方吧)
3、HBase一个region只有一个HRegionServer对外提供服务(没有负载均衡的概念);MongoDB的shards(类似于region)支持负载均衡(主从结构,通过日志进行同步,这个HBase也在开发计划当中)
4、HBase根据文件的大小来控制region的分裂;MongoDB根据负载来决定shards的分裂
金牌会员, 积分 1770, 距离下一级还需 1230 积分
论坛徽章:2
正在研究中,还需向你多请教!
论坛徽章:11
提示: 作者被禁止或删除 内容自动屏蔽
注册会员, 积分 57, 距离下一级还需 143 积分
论坛徽章:3
这里有篇文章有解释: .cn/showcontent_63026.htm
MongoDB本身可以做一些简单的统计工作,包括其内置的基于Javascript的MapReduce框架,也包括在MongoDB 2.2版本中引入的新的统计框架。除此之外,MongoDB 还提供了对外部统计工具的接口,这就是本文要说的MongoDB-Hadoop的数据中间件。文章内容来源于MongoDB官方博客
论坛徽章:679
看起来不大一样,HBase是big table的山寨版,列式存储,mongodb是面向文档,查询语言也差异很大
金牌会员, 积分 1770, 距离下一级还需 1230 积分
论坛徽章:2
tigerfish 发表于
看起来不大一样,HBase是big table的山寨版,列式存储,mongodb是面向文档,查询语言也差异很大
因为 同学的项目中有用 mongodb,但是我向他问关于hadoop的hbase,他也讲不清楚,只是说,都是内存数据库,差不多,当时我感觉他忽悠我
论坛徽章:6
jerry_xing8 发表于
因为 同学的项目中有用 mongodb,但是我向他问关于hadoop的hbase,他也讲不清楚,只是说,都是内存数据库, ...
这些都不是内存数据库哈
论坛徽章:25
论坛徽章:16
坐看牛人解惑
扫一扫加入本版微信群大数据内存数据库与NoSql数据库_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
大数据内存数据库与NoSql数据库
&&大数据,内存数据库与NoSql数据库
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩53页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢这一切都是通过使用一种叫做tmpfs的特殊类型文件系统实现的。在Linux中它看上去同常规的文件系统(FS)一样,只是它完全位于RAM中(除非其大小超过了RAM的大小,此时它还可以进行swap,这个非常有用!)。我的服务器中有32GB的RAM,下面让我们创建一个16GB的 tmpfs:
# mkdir /ramdata
# mount -t tmpfs -o size=16000M tmpfs /ramdata/
Filesystem
Used Available Use% Mounted on
/dev/xvde1
0% /dev/shm
0% /ramdata
接下来要用适当的设置启动MongoDB。为了减小浪费的RAM数量,应该把smallfiles和noprealloc设置为true。既然现在是基于RAM的,这么做完全不会降低性能。此时再使用journal就毫无意义了,所以应该把nojournal设置为true。
dbpath=/ramdata
nojournal = true
smallFiles = true
noprealloc = true
MongoDB启动之后,你会发现她运行得非常好,文件系统中的文件也正如期待的那样出现了:
MongoDB shell version: 2.3.2
connecting to: test
& db.test.insert({a:1})
& db.test.find()
{ &_id& : ObjectId(&eafa5d80b5d2c145&), &a& : 1 }
# ls -l /ramdata/
total 65684
-rw-------. 1 root root
Apr 30 15:52 local.0
-rw-------. 1 root root
Apr 30 15:52 local.ns
-rwxr-xr-x. 1 root root
5 Apr 30 15:52 mongod.lock
-rw-------. 1 root root
Apr 30 15:52 test.0
-rw-------. 1 root root
Apr 30 15:52 test.ns
drwxr-xr-x. 2 root root
40 Apr 30 15:52 _tmp
现在让我们添加一些数据,证实一下其运行完全正常。我们先创建一个1KB的document,然后将它添加到MongoDB中4百万次:
& str = &&
& aaa = &aaaaaaaaaa&
aaaaaaaaaa
& for (var i = 0; i & 100; ++i) { str += }
& for (var i = 0; i & 4000000; ++i) { db.foo.insert({a: Math.random(), s: str});}
& db.foo.stats()
&ns& : &test.foo&,
&count& : 4000000,
&size& : ,
&avgObjSize& : ,
&storageSize& : ,
&numExtents& : 26,
&nindexes& : 1,
&lastExtentSize& : ,
&paddingFactor& : 1,
&systemFlags& : 1,
&userFlags& : 0,
&totalIndexSize& : ,
&indexSizes& : {
可以看出,其中的document平均大小为1136字节,数据总共占用了5GB的空间。_id之上的索引大小为130MB。现在我们需要验证一件&非常重要的事情:RAM中的数据有没有重复,是不是在MongoDB和文件系统中各保存了一份?还记得MongoDB并不会在她自己的进程内缓存任何数据,她的数据只会缓存到文件系统的缓存之中。那我们来清除一下文件系统的缓存,然后看看RAM中还有有什么数据:# echo 3 & /proc/sys/vm/drop_caches
-/+ buffers/cache:
可以看到,在已使用的6.3GB的RAM中,有5.8GB用于了文件系统的缓存(缓冲区,buffer)。为什么即使在清除所有缓存之后,系统中仍然还有5.8GB的文件系统缓存??其原因是,Linux非常聪明,她不会在tmpfs和缓存中保存重复的数据。太棒了!这就意味着,你在RAM只有一份数据。下面我们访问一下所有的document,并验证一下,RAM的使用情况不会发生变化:& db.foo.find().itcount()
-/+ buffers/cache:
# ls -l /ramdata/
total 5808780
-rw-------. 1 root root
Apr 30 15:52 local.0
-rw-------. 1 root root
Apr 30 15:52 local.ns
-rwxr-xr-x. 1 root root
5 Apr 30 15:52 mongod.lock
-rw-------. 1 root root
Apr 30 16:00 test.0
-rw-------. 1 root root
Apr 30 16:00 test.1
-rw-------. 1 root root
Apr 30 16:02 test.10
-rw-------. 1 root root
Apr 30 16:03 test.11
-rw-------. 1 root root
Apr 30 16:03 test.12
-rw-------. 1 root root
Apr 30 16:04 test.13
-rw-------. 1 root root
Apr 30 16:04 test.14
-rw-------. 1 root root
Apr 30 16:00 test.2
-rw-------. 1 root root
Apr 30 16:00 test.3
-rw-------. 1 root root
Apr 30 16:00 test.4
-rw-------. 1 root root
Apr 30 16:01 test.5
-rw-------. 1 root root
Apr 30 16:01 test.6
-rw-------. 1 root root
Apr 30 16:04 test.7
-rw-------. 1 root root
Apr 30 16:03 test.8
-rw-------. 1 root root
Apr 30 16:02 test.9
-rw-------. 1 root root
Apr 30 15:52 test.ns
drwxr-xr-x. 2 root root
40 Apr 30 16:04 _tmp
Filesystem
Used Available Use% Mounted on
/dev/xvde1
0% /dev/shm
% /ramdata
果不其然! :)
本文已收录于以下专栏:
相关文章推荐
日前有测试需求将MongoDB改成内存数据库。我们知道MongoDB有一个In-Memory存储引擎,但是社区版不能用。所以我们自己想办法将MongoDB改造成内存数据库,经过探索,有三种方式。
英文原文:How to use MongoDB as
a pure in-memory DB (Redis style)
http://www.oschina.net/transl...
最近一直跑得好好的项目总是会莫名其妙的停了服务,最初的时候没有在意这个情况,觉得可能只是一个意外而已,可连着发生了好几次,就觉得有点怪异了,然后查看tomcat的log文件,就发现了问题所在了,...
有两篇翻译博文《Lxc之二—网络设置》和《linuxnamespace-之使用》;LXC文章中关于网络的设置是从用户空间配置的,从该文章可以知道网络命名空间的一些基本概念和其提供的功能。而《linux...
本序列文章将介绍cgroup概念,cgroup框架,cgroup的子系统
What Cgroup?
Control Groups provide a mechanism fora...
把 MongoDB 当成是纯内存数据库来使用
来源:开源中国社区 作者:oschina
将MongoDB用作内存数据库...
英文原文:How to use MongoDB as
a pure in-memory DB (Redis style)
http://www.oschina.net/transl...
将MongoDB用作内存数据库(in-memory database),也即,根本就不让MongoDB把数据保存到磁盘中的这种用法,引起了越来越多的人的兴趣...
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)233被浏览37272分享邀请回答35添加评论分享收藏感谢收起113 条评论分享收藏感谢收起查看更多回答

我要回帖

更多关于 闪存数据库 的文章

 

随机推荐