MongoDB 初体验:存储引擎 MMAPv1 与高内存消耗及升级迁移

本文探讨了MongoDB 3.0版本中,MMAPv1存储引擎导致高内存消耗的原因,并介绍了升级到WiredTiger存储引擎的过程。作者通过分析数据库状态和存储引擎特性,揭示了MMAPv1使用内存映射导致的内存占用问题。在升级到WiredTiger后,通过设置`wiredTigerCacheSizeGB`限制内存使用,以优化内存管理。
摘要由CSDN通过智能技术生成

想不到我和MongoDB的第一次亲密接触竟然是这样开始的。

640?wx_fmt=jpeg

当我对公司的一个内部系统性能无可忍受时,意外发现在这个内存仅为 32G 的服务器上,运行着一个 MongoDB 数据库,其主进程 mongod 占用了 30.705 G的虚拟内存空间。这立刻引起了我的兴趣,必须要研究一下其工作原理。

640?wx_fmt=jpeg

这个数据库的版本是 3.0 :

 [root@enmotech bin]# ./mongod --version

db version v3.0.12


那么,为什么 MongoDB 会消耗这么多内存呢?

通过数据库的状态查询,可以看到同样内存分配情况,Resident的固有内存分配了254M,Virtual的虚拟内存分配了 31,441M:

> db.serverStatus().mem;

{

"bits" : 64,

"resident" : 254,

"virtual" : 31441,

"supported" : true,

"mapped" : 15498,

"mappedWithJournal" : 30996

}

再看一下存储引擎,当前数据库使用的存储引擎是 mmapv1 :

> db.serverStatus().storageEngine;

{ "name" : "mmapv1" }


MMAPv1 实际上就是 MongoDB 在 3.0 以前原有的存储引擎,在 3.0 版本它也继续作为 MongoDB 的默认存储引擎,而在 MongoDB 3.2 版本默认存储引擎已经改为 WiredTiger。

640?wx_fmt=jpeg

这个变化,就类似MySQL的存储引擎从 MyISAM 变化到 InnoDB 一样,性能是关键。在 3.0 版本之前,MMAPv1 对锁请求的做法是,以 Database 为单位加锁, 3.0 版本,MMAPv1 则开始使用以 Collection 为单位的加锁(collection-wise locking)。但是这仍然不够,WiredTiger 使用的实际为 Document 级的乐观锁机制,最终替代了 MMAPv1 .


这其中的主要原因是 2014 年 12 月,MongoDB 收购了 WiredTiger 公司,WiredTiger 为 MongoDB 3.0 开发了一个专用版本的存储引擎,我们不得不钦佩 MongoDB 的英明之处,想一想 MySQL 的历程,当 MySQL 的最佳存储引擎 InnoDB 被 Oracle 釜底抽薪收购(2006年)之后,MySQL 最后被 SUN 收购(2008年),辗转落入 Oracle 之手(2009年),当然自2009年 MySQL 5.5 开始 InnoDB 就成为了 MySQL 默认存储引擎。


通过下图和关系型数据库的对比,我们更好理解MongoDB的概念,虽然从 Database 级别锁到 Collection 级别,但是仍然不够:

640?wx_fmt=jpeg

回过头来,MMAPv1之所以叫 MMAP,是因为这个存储引擎会把数据直接映射到虚拟内存上,即 “memory mapping”。由于MMAPv1使用mmap来将数据库文件映射到内存中,MongoDB总是尽可能的多吃内存,以映射更多的数据文件,并且页面的换入换出基本交给OS控制。


根据官方文档描述:

With MMAPv1, MongoDB automatically uses all free memory on the machine as its cache. System resource monitors show that MongoDB uses a lot of memory, but its usage is dynamic. If another process suddenly needs half the server’s RAM, MongoDB will yield cached memory to the other process.

使用MMAPv1,MongoDB会自动将机器上的所有可用内存用作缓存。 

Technically, the operating system’s virtual memory subsystem manages MongoDB’s memory. This means that MongoDB will use as much free memory as it can, swapping to disk as needed. Deployments with enough memory to fit the application’s working data set in RAM will achieve the best performance.

从技术上讲,操作系统的虚拟内存子系统管理MongoD

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值