mongodb入门之mongodb内存原理

介绍下mongodb的原理,包括内存结构,和数据处理等

在docker中安装mongodb时,会发现mongodb有时候会启动失败,原因就是mongodb对内存的贪得无厌。当然如果想了解mongodb为什么这么耗内存,要从linux的内存管理入手

一.linux管理内存

1.linux内存分为物理内存和虚拟内存,虚拟内存实际是物理内存的抽象,多数情况下,程序访问的是虚拟内存地址,然后操作系统会通过page table机制翻译为物理内存地址

2.Linux采用虚拟内存管理技术,使得每个进程都有互不干涉的进程地址空间,该空间的块大小为4G的线性虚拟空间(和操作系统位数相关),用户看的的都是虚拟地址,可以保证用户程序使用比实际物理内存更大的地址空间

(1)4G的进程地址空间被分为两部分:用户空间和内核空间,用户空间从0-3G,内核空间占据3G-4G。用户进程通常只能访问用户空间的虚拟地址,不能访问内核空间虚拟地址

(2)每当进程切换时,用户空间也跟着变化;而内核空间由内核映射,不会跟着进程改变。内核空间地址有自己对于的页表,用户进程各自有不同的页表

(3)每个进程的用户空间都是完全独立、互不相干的

3.直接从物理内存中读取数据很快,因此,希望所有的数据读取和写入都在内存中完成,然而内存是有限的,这样就会出现了虚拟内存和物理内存的概念。

物理内存时系统硬件提供的内存大小,是真正的内存,虚拟内存时为了满足物理内存不足而提出的,是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间

为了方便管理,虚拟空间被化分为许多大小可变的(但必须是4096的倍数)内存区域,这些区域在进程线性地址中像停车位一样有序排列。这些区域的划分原则是“将访问属性一致的地址空间存放在一起”,所谓访问属性在这里无非指的是“可读、可写、可执行等”。

4.内存的分配与回收

创建进程fork()、程序载入execve()、映射文件mmap()、动态内存分配malloc()/brk()

5.linux内存查看

使用free命令查看内存占用情况

mongodb入门之mongodb内存原理_第1张图片

第一行:

total:物理内存的总大小

used:已经使用的物理内存大小

free:空闲的物理内存大小

shared:多个进程共享的内存大小

buffers/cached:磁盘缓存的大小

第二行Mem:代表物理内存使用情况

第三行(-/+ buffers/cached):代表磁盘缓存使用状态

第四行:Swap表示交换空间内存使用状态

新手看到used一栏数值偏大,free一栏数值偏小,往往会认为内存要用光了。其实并非如此,之所以这样是因为每当我们操作文件的时候,Linux都会尽可能的把文件缓存到内存里,这样下次访问的时候,就可以直接从内存中取结果,所以cached一栏的数值非常的大,不过不用担心,这部分内存是可回收的,操作系统的虚拟内存管理器会按照LRU算法淘汰冷数据。还有一个buffers,也是可回收的,不过它是保留给块设备使用的。

我们就可以推算出系统可用的内存是free + buffers + cached:2723+239+25880=28842

系统实际使用的内存是used – buffers – cached:29377-239-25880=3258

6.内存清理

echo 1 > /proc/sys/vm/drop_caches

二.mongodb怎样使用内存

mongodb使用内存映射存储引擎,

  1. 它会把数据文件映射到内存中,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟内存管理器去处理,这样做的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,幸运的是虚拟内存管理器的存在让我们多数时候并不需要关心这个问题。
  2. MongoDB的内存使用机制让它在缓存重建方面更有优势,简而言之:如果重启进程,那么缓存依然有效,如果重启系统,那么可以通过拷贝数据文件到/dev/null的方式来重建缓存
参考10gen工程师对mongodb内存的介绍

http://news.cnblogs.com/n/124200/


你可能感兴趣的:(NOSQL)