overview

MongoDB使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了,但这并不代表将文件map到物理内存,只有访问到这块数据时才会被操作系统以Page的方式换到物理内存。MongoDB将内存管理工作交给操作系统的虚拟内存管理器来完成,这样就大大简化了MongoDB的工作,同时操作系统会将数据刷新保存到磁盘上,下图就是MMAP的简要工作原理图

内存使用情况

查看Linux虚拟内存管理器是否对内存做了限制,如果显示为unlimited表示无限制

[jiangjianjian@f1-mongo1 ~]$ ulimit -a | grep memory
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
virtual memory (kbytes, -v) unlimited

修改虚拟内存限制

[jiangjianjian@f1-mongo1 ~]$ ulimit -m unlimited
[jiangjianjian@f1-mongo1 ~]$ ulimit -v unlimited

查看当前MongoDB的连接数

mongo中每一个连接都是一个线程,需要一个stack,从结果中可看到当前连接数为2372,最大连接数为51200
bj1-farm1:PRIMARY> db.serverStatus().connections
{
"current" : 2372,
"available" : 48828,
"totalCreated" : NumberLong(185449264)
}

Linux下缺省的Stack大小查看

[jiangjianjian@f1-mongo1 ~]$ ulimit -a | grep stack
stack size (kbytes, -s) 10240

MongoDB实际使用的Stack大小查看

可以用如下命令确认(单位:K)
[root@f1-mongo1 journal]# cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}'
10240

调整stack大小的方法

如果Stack过大,比如上述的10240K,我们可以通过以下命令调整stack大小
[root@f1-mongo1 journal]# ulimit -s 1024

MongoDB释放内存的命令

mongo> use admin
mongo> db.runCommand({closeAllDatabases:1})

Mongodb自带命令查看其内存使用情况

其中resident代表物理内存使用情况,单位为M;而virtual为虚拟内存使用情况,mapped是映射到内存的数据大小。这里虚拟内存是mapped的两倍,是因为我们开启了Journal日志,需要在内存中多映射一次,大概就是它的两倍了。如果关闭Journal日志,虚拟内存大小将和mapped大小相当。
bj1-farm1:PRIMARY> db.serverStatus().mem
{
"bits" : 64,
"resident" : 46662,
"virtual" : 326198,
"supported" : true,
"mapped" : 161399,
"mappedWithJournal" : 322798
}

top命令查看

这里还可以通过top命令观察mongodb的内存使用情况,如下图,可看到其中的VIRT和RES与上述命令的结果一样
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12603 mongod 20 0 318g 45g 44g S 28.0 72.1 27230:21 mongod

free命令查看

而再通过free命令可查看到内存占用中有多少是因为数据缓存和cache,关于如何查看free命令,参见http://blog.csdn.net/cug_jiang126com/article/details/42266653
[jiangjianjian@f1-mongo1 ~]$ free
total used free shared buffers cached
Mem: 65921032 65262376 658656 0 274264 61742808
-/+ buffers/cache: 3245304 62675728
Swap: 100663288 11884 100651404

Mongodb内存大小配置建议

MongoDB应该分配的内存大小最好满足内存大小>索引+热数据+连接占用内存,通过db.stats()命令可查看到当前 数据库的索引大小情况
bj1-farm1:PRIMARY> db.stats()
{
"db" : "yc_driver", //当前数据库
"collections" : 5, //当前数据库多少表
"objects" : 2911281, //当前数据库所有表多少条数据
"avgObjSize" : 240.28991086741541, //每条数据的平均大小
"dataSize" : 699551452, //所有数据的总大小
"storageSize" : 858513408, //所有数据占的磁盘大小
"numExtents" : 21,
"indexes" : 5, //索引数
"indexSize" : 569229472, //索引大小
"fileSize" : 2080374784, //预分配给数据库的文件大小
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
},
"ok" : 1
}

Mongodb内存管理和使用情况情况查询相关推荐

  1. cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题

    cocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时的操作放到了主线程中,游戏的界面就会卡,这是不能容忍的,游戏最基本的条件就是流畅性,这就是为什么游戏开发选择C++的原因. ...

  2. 理解 iOS 和 macOS 的内存管理

    在 iOS 和 macOS 应用的开发中,无论是使用 Objective-C 还是使用 swift 都是通过引用计数策略来进行内存管理的,但是在日常开发中80%(这里,我瞎说的,8020 原则嘛?)以 ...

  3. cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题

    cocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时的操作放到了主线程中,游戏的界面就会卡,这是不能容忍的,游戏最基本的条件就是流畅性,这就是为什么游戏开发选择C++的原因. ...

  4. Linux内核机制总结内存管理之每处理器内存分配器(十七)

    文章目录 1 每处理器内存分配器 1.1 编程接口 1.1.1 静态每处理器变量 1.1.2 动态每处理器变量 1.1.3 访问每处理器变量 1.2 技术原理 1.2.1 确定块的参数 1.2.2 创 ...

  5. C++中运行一个程序的内存分配情况及qt中的内存管理机制

    一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一 ...

  6. 小米手机Android内存管理基本情况介绍

    1 Android Binder,基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通讯(IPC,inter-process communication). 源代码位于driv ...

  7. CentOS 7 查询CPU、内存、磁盘的使用情况

    本篇介绍记录一下CentOS 7 查询CPU型号.CPU核心.CPU详情.内存占用.磁盘使用情况 查看CPU型号 dmidecode -s processor-version (base) [root ...

  8. chrome 内存管理机制_出色的Suspender可以更有效地管理Chrome的内存使用情况

    chrome 内存管理机制 Chrome has built up quite a loyal following over the years, but while it is an adept w ...

  9. ubuntu查看内存占用和查看cpu使用情况的简单方法(ubuntu内存管理)

    单独查看内存使用情况的命令:free -m 查看内存及cpu使用情况的命令:top 也可以安装htop工具,这样更直观, 安装命令如下:sudo apt-get install htop 安装完后,直 ...

最新文章

  1. 36进12第二场淘汰赛:老牟如何晋级?(视频)
  2. android apk 微信登入_Android集成第三方微信登录
  3. centos 上 crontab 计划任务 ,这个版本解释的比较清晰
  4. Quorum企业以太坊环境搭建教程
  5. LAMP架构介绍,MySQL、MariaDB介绍,MySQL安装
  6. Flask-Login用户登陆
  7. 机器学习中的训练与损失 test and loss (训练loss不下降原因集合)
  8. JS数组去重方法记录
  9. bash shell基础之三字符串测试及for循环
  10. 不会几个框架,都不好意思说搞过前端: Vue.js - 60分钟快速入门
  11. zip 打包_Thinkphp6利用ZipArchive打包下载文件
  12. 单链表之寻找中间结点
  13. 【机器学习】课程设计布置:某闯关类手游用户流失预测
  14. 数据结构与算法 python版 之 递归三定律
  15. 财务自由到底是啥感觉啊...
  16. 人工智能第一讲:发展历史图解
  17. docker基础——Docker是什么
  18. raspberry pi_如何制作Raspberry Pi游戏手柄
  19. 阿里巴巴B2B主要股东
  20. 赵小楼《天道》《遥远的救世主》解析(3)为什么说肖亚文把丁元英安排到古城是惜缘中的小攀缘?

热门文章

  1. 计算机语言 angela,Angela
  2. python调用opengl_Python运行OpenGL示例
  3. 净迁移人口预测程序python_高质量深度学习模型, 一键模型预测,迁移学习很简单...
  4. linux 查看端口 程序,linux开发:Linux下查看端口占用
  5. 【渝粤教育】电大中专计算机常用工具软件 (2)作业 题库
  6. 【渝粤教育】广东开放大学 国际私法 形成性考核 (41)
  7. labview求n阶乘的和_求极限方法总结
  8. 计算机共享原理,synchronize底层原理 游戏电脑问题解决分享!
  9. 【OFDM系列2】OFDM复信号符号信噪比EsN0、比特信噪比EbN0、SNR的含义及关系详解
  10. pyinstaller安装失败解决