MongoDB 内存运用状况剖析
MongoDB是一个基于散布式文件存储的数据库。由C++说话编写。旨在为WEB利用供给可扩展的高机能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰硕,最像关系数据库的。他支撑的数据构造非常松懈,是相似json的bson格局,因而可以存储比较复杂的数据类型。Mongo最大的特色是他支撑的查询说话非常强大,其语法有点相似于面向对象的查询说话,险些可以实现相似关系数据库单表查询的绝大局部功能,而且还支撑对数据创立索引。
先 ps 一下看看。
$ ps aux|grep mongod
mongo 26994 9.0 20.0 797264324 13243052 ? Sl May16 117:03 /path/to/mongodb/bin/mongod
总共 760G 多的虚拟内存,但是物理内存就只要 12.6G 。这个机器可是有 64G 内存的哦,这看起来 MongoDB 完全没用多少内存嘛。
再看看 free 的效果。
$ free -m
total used free shared buffers cached
Mem: 64544 64279 265 0 134 60413
-/+ buffers/cache: 3731 60813
Swap: 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: 15465901/100219772 58G/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 了。
出处:http://xiezhenye.com/2013/05/mongodb-%e5%86%85%e5%ad%98%e4%bd%bf%e7%94%a8.html
热门标签:dede模板 / destoon模板 / dedecms模版 / 织梦模板