MongoDB 内存管理相关总结

MongoDB的内存用在哪儿?

在MongoDB中,加载各种依赖的lib到内存、管理客户端请求、元数据管理存储等工作都需要占用内存,但其实内存使用的大部分还是在存储引擎和客户端连接请求处理方面。

一方面是存储引擎的cache,通常情况下,我们可以使用参数cacheSizeGB参数(下面会讲到)来控制内存使用率,一旦超过这个内存使用率,则MongoDB的存储引擎会淘汰掉部分内存中的数据页。

正常运行的MongoDB实例,内存使用率大约为80%的cacheSizeGB参数值,因为超过80%之后,内存淘汰策略就开始淘汰过期的数据页了,如果出现使用率过大,则多半表示当前实例内存淘汰的压力比较大。请求就有延时的可能。

另一方面,如果客户端的连接数过多,建立过多的tcp链接,这些连接的维护,需要有read buffer和write buffer以用来收发网络包,所以也会产生开销。每个连接占用的内存大小约为2MB左右。

如何限制MongoDB对内存的使用?

最近在线上发现了一些有意思的现象,比如某一台服务器上部署了MySQL和MongoDB的服务,然后内存报警,说是内存已经使用了超过85%了,这个时候,通常我们会想到迁移服务。将MySQL或者MongoDB的服务切换到其他的机器上,这样,服务器的内存就可以节省下来。

但是实际的现象就是,如果我们迁移了MySQL的服务之后,服务器的内存临时会降下来,但是一段时间过后,又会报警,因为MongoDB已经将MySQL腾出来的内存空间也占用完了。

我们知道,在MySQL中,占用内存比较多的就是innodb_buffer_pool,还有一堆其他的buffer,除此之外,连接数也是一个需要考虑的因素。

在MongoDB中,如果我们不限制MongoDB的内存使用,那么MongoDB就会尽可能的占用更多的内存来提高读写性能。具体的策略如下:

从MongoDB3.4开始, WiredTiger存储引擎默认的cache size是下面2个值中较大的一个。

公式一:0.5*(物理内存-1GB)

公式二:256MB

例如,物理内存4G,则cache size=1.5GB,如果物理内存1.5G,则cache size=0.5*(1.5-1)=250MB < 256MB ,所以取值为256MB

MongoDB中可以通过配置文件的内容限定MongoDB所使用的内存,关键参数如下:

storage:
 wiredTiger:
  engineConfig:
   cacheSizeGB: <number> # 单位是GB,浮点型
   journalCompressor: <string>
   directoryForIndexes: <boolean>
   maxCacheOverflowFileSizeGB: <number>
  collectionConfig:
   blockCompressor: <string>
  indexConfig:
   prefixCompression: <boolean>

上面的参数,一般情况下,单机单实例,建议配置在内存的60%左右。

cacheSizeGB参数配置的注意事项

几点建议:

1、不要增加WiredTiger的内部cache size超过默认值

2、WiredTiger存储引擎使用WiredTiger内部缓存和文件系统缓存

3、WiredTiger会自动使用所有剩余的文件系统缓存

4、单机多实例请务必减少mongod的内存分配值

如何查看内存使用情况?

db.hostInfo()

这个命令可以查看MongoDB的内存限制情况,查看结果如下:

SECONDARY> db.hostInfo()
{
  "system" : {
    "currentTime" : ISODate("2020-12-31T03:51:28.278Z"),
    "hostname" : "localhost.localdomain:24204",
    "cpuAddrSize" : 64,
    "memSizeMB" : 64393,
    "numCores" : 8,
    "cpuArch" : "x86_64",
    "numaEnabled" : false
  },

以上就是MongoDB 内存管理相关总结的详细内容,更多关于MongoDB 内存管理的资料请关注我们其它相关文章!

(0)

相关推荐

  • cgroup限制mongodb进程内存大小

    以限制mongodb的内存大小为例. mkdir /cgroup/memory/test/ echo 50M > /cgroup/memory/test/memory.limit_in_bytes echo 50M > /cgroup/memory/test/memory.memsw.limit_in_bytes cgexec -g memory:test mongod -port 27017 --bind_ip 127.0.0.1 --dbpath /var/lib/mongo 通过cgro

  • 解决MongoDB占用内存过大频繁死机的方法详解

    从MongoDB 3.4开始,默认的WiredTiger内部缓存大小是以下两者中的较大者: 50%(RAM-1 GB),或 256 MB 例如,在总共有4GB RAM的系统上,WiredTiger缓存将使用1.5GB RAM(). 相反,总内存为1.25 GB的系统将为WiredTiger缓存分配256 MB,因为这是总RAM的一半以上减去1 GB(). // 4GB 0.5 * (4 GB - 1 GB) = 1.5 GB // 1.25GB 0.5 * (1.25 GB - 1 GB) =

  • python监控linux内存并写入mongodb(推荐)

    (需要安装psutil 用来获取服务器资源,以及pymongo驱动)#pip install psutil #pip install pymongo #vim memory_monitory.py 文件内容如下 #!/usr/bin/env python # -*- coding: UTF-8 -*- import psutil import socket import time from pymongo import MongoClient mongodbIp = '192.168.200.1

  • MongoDB 内存使用情况分析

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引. 先 ps 一下看看.

  • 将MongoDB作为Redis式的内存数据库的使用方法

     基本思想 将MongoDB用作内存数据库(in-memory database),也即,根本就不让MongoDB把数据保存到磁盘中的这种用法,引起了越来越多的人的兴趣.这种用法对于以下应用场合来讲,超实用: 置于慢速RDBMS系统之前的写操作密集型高速缓存 嵌入式系统 无需持久化数据的PCI兼容系统 需要轻量级数据库而且库中数据可以很容易清除掉的单元测试(unit testing) 如果这一切可以实现就真是太优雅了:我们就能够巧妙地在不涉及磁盘操作的情况下利用MongoDB的查询/检索功能.可

  • 解决MongoDB 排序超过内存限制的问题

    对集合执行一个大排序操作(如聚合),出现以下错误:(测试版本:MongoDB 3.0.6) > db.bigdata.aggregate( {$group : {_id : "$range", total : { $sum : 1 }}}, {$sort : {total : -1}} ); #... aggregate failed at Error (<anonymous>) at doassert (src/mongo/shell/assert.js:11:14

  • MongoDB 内存管理相关总结

    MongoDB的内存用在哪儿? 在MongoDB中,加载各种依赖的lib到内存.管理客户端请求.元数据管理存储等工作都需要占用内存,但其实内存使用的大部分还是在存储引擎和客户端连接请求处理方面. 一方面是存储引擎的cache,通常情况下,我们可以使用参数cacheSizeGB参数(下面会讲到)来控制内存使用率,一旦超过这个内存使用率,则MongoDB的存储引擎会淘汰掉部分内存中的数据页. 正常运行的MongoDB实例,内存使用率大约为80%的cacheSizeGB参数值,因为超过80%之后,内存

  • 剖析iOS开发中Cocos2d-x的内存管理相关操作

    一,IOS与图片内存 在IOS上,图片会被自动缩放到2的N次方大小.比如一张1024*1025的图片,占用的内存与一张1024*2048的图片是一致的.图片占用内存大小的计算的公式是:长*宽*4.这样一张512*512 占用的内存就是 512*512*4 = 1M.其他尺寸以此类推.(ps:IOS上支持的最大尺寸为2048*2048). 二,cocos2d-x 的图片缓存 Cocos2d-x 在构造一个精灵的时候会使用spriteWithFile或者spriteWithSpriteFrameNa

  • 简单讲解Objective-C的基本特性及其内存管理方式

    一.OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码. 可以使用OC开发mac osx平台和ios平台的应用程序. 拓展名:c语言-.c  OC语言.-m  兼容C++.-mm 注:其实c语言和oc甚至任何一门语言都只是我们为了实现一些功能,达到一些效果而采用的工具,抛开语法的差别外,我想最重要的应该是在解决问题的时候考虑的角度和方法不一样而已,然而这也构成了学习一门语言的重要性. 二.语法预览 (1)关键字 基本上所有

  • JVM内存管理之JAVA语言的内存管理详解

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题. 可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个"不懂内存"的帽子,这着实有点让人难以接受.毕竟JAVA当中没有malloc和delete.没有析构函数.没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不

  • 养成良好的C++编程习惯之内存管理的应用详解

    开篇导读    虽然本系列文章定位为科普读物,但本座相信它们不但适合新手们学习借鉴,同时也能引发老鸟们的反思与共鸣.欢迎大家提出宝贵的意见和反馈 ^_^ 在开篇讲述本章主要内容之前,本座首先用小小篇幅论述一下一种良好的工作习惯 -- 积累.提炼与求精.在工作和学习的过程中,不断把学到的知识通过有效的方式积累起来,形成自己的知识库,随着知识量的扩大,就会得到从量变到质变的提升.另外还要不断地对知识进行提炼,随着自己知识面的扩大以及水平的提升,你肯定会发现原有知识库存在着一些片面.局限.笨拙甚至错误

  • 简述iOS属性中的内存管理参数

    一,assign 代表设置时候直接赋值,而不是复制或者保留它. 二,retain. 会在赋值的时候把新值保留.此属性只能用于Object-C对象类型. 三,copy 在赋值时,将新值复制一份,复制工作由copy执行,此属性只对那些实行了NSCopying协议的对象类型有效. 总结 以上所述是小编给大家介绍的iOS属性中的内存管理参数 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的! 您可能感兴趣的文章: 详解关于iOS内存管理的规则思考 详解iOS应用开发中的ARC内

  • c++动态内存管理与智能指针的相关知识点

    目录 引言 一.介绍 二.shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象… 使用动态生存期的资源的类 应用举例:Blob类 定义Blob类 StrBlob的拷贝.赋值和销毁 三.直接管理内存 使用new分配内存 使用new动态分配和初始化对象 动态分配const对象 内存耗尽 使用delete释放内存 基本介绍 举例 四.shared_ptr和new结合使用 new直接初始化share_ptr 初始化时传入可调用对象

  • Python深入学习之内存管理

    语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向对象的语言的内存管理方式.  对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象.而a是一个引用.利用赋值语句,引用a指向对象1.Python是动态类型的语言(参考动态类型),对象与引用分离.Pytho

  • IOS中内存管理那些事

    Objective-C 和 Swift 语言的内存管理方式都是基于引用计数「Reference Counting」的,引用计数是一个简单而有效管理对象生命周期的方式.引用计数分为手动引用计数「ARC: AutomaticReference Counting」和自动引用计数「MRC: Manual Reference Counting」,现在都是用 ARC 了,但是我们还是很有必要了解 MRC. 1. 引用计数的原理是什么? 当我们创建一个新对象时,他的引用计数为1: 当有一个新的指针指向这个对象

  • 深入讲解Swift的内存管理

    前言 LLVM编译器的好:Swift的内存管理除了要注意引用循环之外,几乎全部被LLVM编译器包揽,不需要开发人员操心. Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配.当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当一个对象没有引用的时候,其内存将会被自动回收.这套机制从很大程度上简化了我们的编码,我们只需要保证在合适的时候将引用置空 (比如超过作用域,或者手动设为 nil 等),就可以确保内

随机推荐