mongodb 内存分析

要想了解mongo的内存机制就要先了解linux系统的内存分析。

第一步:先看看linux的内存参数都是怎么说的

             total       used       free     shared    buffers     cached
Mem:         11912       9045       2866          0         90       3406
-/+ buffers/cache:       5549       6363 
Swap:         2047         14       2033

total:物理内存总大小

used:使用了多少

free:剩余多少

buffers:buffers是指高速缓冲区的大小,是一个空间大小的概念,运行程序常用的数据,在第一次运行

时系统会把它们暂时缓存在一个高速的存储区域,以后再用时就直接从这个区域读取数据供程

序使用,存取这些数据的介质,因其读写速度比硬盘和内存要快得多,所以,buffers的大小对

电脑运行速度的影响是很大的,但这些数据重启电脑或关机后就会自动消失。

cached:cached是指缓存的数据,是真正意义上的实在东西,例如你常用的程序,由于一些数据是这些

程序运行经常要使用到的,系统就会把它们形成文件,缓存到一个特定的位置,下次你再运行

该程序时,就会自动到缓存的位置读取数据供程序运行使用,存储这些数据的区域是在电脑的

硬盘上,理论上讲读写速度是不变的,只是节省了寻找这些数据的时间而也,这样也可间接地

提高了电脑的运行效率。

Swap:当物理内存不够使用的是,系统会在物理硬盘上切割一块空间,当作内存使用。

linux主机的真正可用内存是:真正可用内存=total-used-buffers-cached

系统中显示的used是包括buffers和cached大小的,但是这两个数据是可以被释放的,所以真正使用了多少是:真正使用了的内存=used-buffers-cached



第二步:系统内存说的差不多了,那么我们来看看mongo的内存是怎么和系统配合的。

首先说mongo是一个比较坑但又叫人特别爽的数据库,为什么说坑“是因为它不释放内存,你有100G的内存它也会给你吃满”;为什么说他爽“是因为它把数据放到内存中,所以100w的数据查询会很快”;

那么怎么来判定mongo机器给的内存是否合理呢?下面给出公式:物理内存>mongo索引数据+mongo的热数据

还可以通过mongostat命令来监控MongoDB的内存使用情况,如下所示:

shell> mongostat
mapped vsize res faults
 940g 1893g 21.9g 0

其中内存相关字段的含义是:

mapped:映射到内存的数据大小

visze:占用的虚拟内存大小

res:占用的物理内存大小

注:如果操作不能在内存中完成,结果faults列的数值不会是0,视大小可能有性能问题。

在上面的结果中,vsize是mapped的两倍,而mapped等于数据文件的大小,所以说vsize是数据文件的两倍,之所以会这样,是因为本例中,MongoDB开启了journal,需要在内存里多映射一次数据文件,如果关闭journal,则vsize和mapped大致相当。

参考文档:http://www.ttlsa.com/mongodb/mongodb-and-memory/

时间: 2024-10-27 12:42:13

mongodb 内存分析的相关文章

进制、内存分析

一.进制 1.什么是进制 是一种计数的方式,数值的表示形式 汉字:十一   十进制:11  二进制:1011  八进制:13 多种进制:十进制.二进制.八进制.十六进制.也就是说,同一个整数,我们至少有4种表示方式 软件开发,肯定要了解这个 2.二进制 1>   特点:只有0和1,逢2进1 2>   书写格式:0b或者0b开头 3>   使用场合:二进制指令\二进制文件,变量在内存中就是二进制存储 4>   二进制和十进制的互相转换 5>   n为二进制位所能表示的数据范围(

java 内存分析之方法返回值二

package Demo; class Point { private double x, y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y)

JS内存泄漏 和Chrome 内存分析工具简介(摘)

原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - ARIGATO 链接:http://web.jobbole.com/88463/ 点击 → 了解如何加入专栏作者 了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读

C语言内存分析

一.进制 概念:进制是一种计数方式,是数值的表现形式 4种主要的进制: ①. 十进制:0~9 ②. 二进制:0和1 ③. 八进制:0~7 ④. 十六进制:0~9+a b c d e f C语言在默认的情况下为十进制. int num=1010; // 十进制 int num=0b1100; // 二进制,以0b或者是0B开头 int num=014; // 八进制,以0开头 int num=0x4; // 十六进制,以0x开头 占位符: %d和%i :十进制整数的形式输出一个值 %o :以不带符

变量的内存分析

一.字节和地址 1.内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间就相当于是每个字节,地址就是房号,根据房号可以找到房间(根据地址也可以找到内存中的字节).相邻房间的房号是连续的,相邻字节的地址也是连续的.计算机中通常以十六进制表示地址. 2.不同数据类型占用的字节是不一样的,数据越大则占用的字节数越多.如在64位编译器下,int类型占据4个字节,char类型占据1个字节. 二.变量的存储 1.内存寻址由大到小

黑马程序员——C语言——内存分析

内存分析主要包括以下几部分内容:进制.类型说明符.位运算和关于char类型的一些内容. 一. 进制(二进制.八进制.十进制.十六进制) 1.二进制 ①  特点:只有0和1,逢2进1 ②  书写格式:0b或者0b开头 ③  使用场合:二进制指令\二进制文件,变量在内存中就是二进制存储 ④  二进制和十进制的互相转换 ⑤  n为二进制位所能表示的数据范围(不考虑负数):0~2的n次方-1 2.八进制 ①  特点:0~7,逢八进一 ②  书写格式:0开头 ③  八进制和二进制的互相转换 3. 十六进制

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

js:深入prototype(上:内存分析)

/** * 以下演示了通过原型的创建方式,使用基于原型的创建可以将属性和方法 * 设置为Person专有的,不能通过window来调用. * 原型是javascript中的一个特殊对象,当一个函数创建之后,会随之就产生一个原型对象 * 当通过这个这个函数的构造函数创建了一个具体的对象之后,在这个具体的对象中,就会有一个属性指向原型 */ //第一种状态 function Person(){                        } //第二种状态 Person.prototype.nam

Windows系统内存分析工具的介绍

? Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任务管理器(Task Manager), 资源监视器(Resource Manager), 性能监视器(Performance Monitor), 还有SysInternals工具, ?RamMap, PoolMon用以分析内存问题.本文简单介绍上述工具的快速使用方法,如果需要了解深入了解,请参考微软