Mongodb記憶體管理和使用情況情況查詢
MongoDB使用的是記憶體對映儲存引擎,即Memory Mapped Storage Engine,簡稱MMAP。MMAP可以把磁碟檔案的一部分或全部內容直接對映到記憶體,這樣檔案中的資訊位置就會在記憶體中有對應的地址空間,這時對檔案的讀寫可以直接用指標來做,而不需要read/write函式了,但這並不代表將檔案map到實體記憶體,只有訪問到這塊資料時才會被作業系統以Page的方式換到實體記憶體。MongoDB將記憶體管理工作交給作業系統的虛擬記憶體管理器來完成,這樣就大大簡化了MongoDB的工作,同時作業系統會將資料重新整理儲存到磁碟上,下圖就是MMAP的簡要工作原理圖
記憶體使用情況
檢視Linux虛擬記憶體管理器是否對記憶體做了限制,如果顯示為unlimited表示無限制
[jiangjianjian@f1-mongo1 ~]$ ulimit -a | grep memorymax 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 stackstack 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 adminmongo> 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
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-1875026/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 05記憶體情況記憶體
- [20170406]查詢佔用記憶體情況.txt記憶體
- SOLARISE檢視記憶體使用情況記憶體
- Linux檢視CPU和記憶體使用情況Linux記憶體
- 如何檢查 Android 應用的記憶體使用情況Android記憶體
- 如何觀察程式的記憶體佔用情況記憶體
- Java記憶體溢位情況Java記憶體溢位
- 查詢表空間使用情況
- 查詢鎖等待情況
- 檢查 Linux 中記憶體使用情況的 8 條命令Linux記憶體
- 檢視LINUX程式記憶體佔用情況Linux記憶體
- 使用 vmstat 命令確定記憶體使用情況記憶體
- linux下檢視記憶體使用情況Linux記憶體
- 在Linux中,如何檢查系統的CPU和記憶體使用情況?Linux記憶體
- Oracle查詢表空間使用情況Oracle
- Linux效能優化:記憶體使用情況分析Linux優化記憶體
- PowerShell 指令碼來監控 CPU、記憶體和磁碟使用情況:指令碼記憶體
- ORACLE查詢所有表空間使用情況Oracle
- Redis 記憶體突增時,如何定量分析其記憶體使用情況Redis記憶體
- 使用 top 命令瞭解 Fedora 的記憶體使用情況記憶體
- 使用show engine innodb status 檢視記憶體使用情況記憶體
- Linux系統下分析記憶體使用情況的管理工具Linux記憶體
- 查詢表空間使用情況的指令碼指令碼
- Sqlserver查詢出所有表的大小使用情況SQLServer
- ORCLE中ASM磁碟空間使用情況查詢ASM
- Oracle 查詢各表空間使用情況--完善篇Oracle
- 查詢Oracle資料檔案的使用情況Oracle
- Linux 檢視記憶體使用情況的幾種方法Linux記憶體
- 監控 Python 記憶體使用情況和程式碼執行時間!Python記憶體
- Oracle 查詢DB的負載情況Oracle負載
- 解決 SQL Server 耗盡記憶體的情況SQLServer記憶體
- CentOS 系統的磁碟空間佔用情況查詢CentOS
- 表空間使用情況查詢慢的處理
- Oracle查詢表空間使用情況(經典篇)Oracle
- oracle查詢表空間的空間佔用情況Oracle
- Linux技術——linux下檢視記憶體和CPU的使用情況Linux記憶體
- obukhov/redis-inventory: 分析redis記憶體使用情況的CLI工具Redis記憶體
- Linux檢視伺服器記憶體使用情況的命令Linux伺服器記憶體