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命令查看內存佔用情況


第一行:

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/


發佈了35 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章