本人也是前不久剛接觸mongodb,對mongodb的瞭解也不太深入,這裏分享一點個人在使用mongodb中也一點經驗,內容可能有誤,僅供參考。
mongodb是一個nosql非關係型數據庫,是大數據方面用的比較多的非關係型數據庫,提供高併發,其在設計的時候將磁盤上的數據與內存做映射關係,那麼需要讀取磁盤的時候,可以直接讀取內存,提高速度,這是其優點。
另外一方面,mongodb不對內存進行直接管理而是利用操作系統本身的內存關係機制進行管理,因此不能直接在mongodb本上的配置中指定最大內存佔用,而如果不做限制,默認mongodb會將系統中95%左右的內存都佔用掉(根據這段時間線上系統運行狀態發現),導致系統可用內存較少,在這種情況下,mongodb可能會莫名其妙的掛掉(日誌中沒有記錄掛掉原因,直接就沒有後續日誌記錄),個人認爲可能是系統可用內存較少時,當遇到其他需要消耗內存的情況,系統爲了釋放資源把mongodb槍斃了,不過這個是自己的猜測沒有證據。
爲了控制mongodb這個內存吞噬小怪獸,嘗試過網上說的一些方法,其中最多是使用ulimit命令來限制mongodb的使用,但是嘗試後效果不好。
網上說有2種限制的參數,
一、是使用ulimit -m XXX 限制物理內存使用,在給mongodb的進程mongod配置屬於mongod用戶、mongod組後,專門設置針對mongod用戶ulimt -m 2097152 (單位爲Kbytes,2097152=2048*1024=2G),限制mongod用戶物理內存使用爲2G,測試發現,這個限制沒有起作用,操作2G物理內存後還是會增長。
二、是使用ulimit -v XXX 限制虛擬內存使用,這個設置方法跟上面一樣,設置ulimit -v 2097152 ,這個倒是會限制住mongod用戶的內存使用爲2G以下,但是mongod進程在使用虛擬內存達到2G後,如果還對mongodb進行數據插入等操作,那麼由於mongod進程無法再獲取內存,直接就掛掉。
看來使用ulimit來限制mongodb的方法行不通,至少我這裏沒試驗成功。
後來網上找了下,發現cgroup這個東西可以限制內存使用,於是就去找了相關資料,並自己配置試驗了下,發現可以,現在線上系統用這個跑了快一週了,暫時沒發現什麼問題,內存被限制住了。
cgroup是linux內核的一個功能,用於管理系統各種資源,包括cpu、內存等其他資源,個人只看了下內存的使用。可以直接使用cgroup的相關命令配置,也可以使用預先配置cgconfig服務的相關配置文件來管理。
#########################################################################################
上面是廢話,可以不看,配置都在下面!!!
#########################################################################################
cgroup限制mognodb內存使用
下面是操作步驟:
使用的操作系統如下,centos6.5x64
[root@mongo1 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@mongo1 ~]# uname -a Linux mongo1 2.6.32-431.23.3.el6.x86_64 #1 SMP Thu Jul 31 17:20:51 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
一、安裝:
a、cgroup是linux系統的一個內核組件,只需要安裝控制接口程序
yum install -y libcgroup
b、啓動cgroup的管理程序
service cgconfig start
查看cgconfig是否啓動
service cgconfig status
設置開機啓動
chkconfig cgconfig on
二、配置:
a、先看cgconfig配置文件:
[root@mongo1 mongodb]# cat /etc/cgconfig.conf mount { cpuset = /cgroup/cpuset; cpu = /cgroup/cpu; cpuacct = /cgroup/cpuacct; memory = /cgroup/memory; devices = /cgroup/devices; freezer = /cgroup/freezer; net_cls = /cgroup/net_cls; blkio = /cgroup/blkio; } group DBLimitedGroup { memory { memory.limit_in_bytes = "32212254720" ; } }
上面配置文件中,mount{...} 這一部分是安裝libcgroup後生成的/etc/cgconfig.conf中默認有的,目的是定義各個子系統的掛載點,可以不用管。
爲了限制mongodb,這裏定義了一個group名字叫做DBLimitedGroup,這個group中定義了對內存memory進行限制,限制的項爲memory.limit_in_bytes ,它的值爲32212254720(32212254720/1024/1024/1024=30GB),線上服務器是32G的內存,這裏設置限制爲30G給mongodb。根據自己的情況設置,數值的單位爲 byte字節,比如1G=1*1024*1024*1024=1073741824(byte)
b、然後看cgrules.conf
cat /etc/cgrules.conf # /etc/cgrules.conf #The format of this file is described in cgrules.conf(5) #manual page. # # Example: #<user> <controllers> <destination> #@student cpu,memory usergroup/student/ #peter cpu test1/ #% memory test2/ # End of file *:mongod memory DBLimitedGroup/
這個cgrules.conf是配置cgexec命令的默認配置,後面會用到cgexec來執行mongod的程序,"#"開頭是註釋,不用管,看最後一行。
上面的意思爲:
* 所有的用戶以及用戶組
mongod mongod程序名(進程)
memory 使用memory子系統中的配置
DBLimitedGroup cgroup.conf中自定義的group
全部連在一起就是說,執行cgexec時,如果滿足“任何用戶任何組執行mongod程序,那麼被執行的進程(及mongod進程)將滿足memory內存子系統中的DBLimitedGroup中的所有限制”
而DBLimitedGroup中的限制就是,限制內存使用爲32G。
這樣使用cgroup就限制了指定進程(這裏是mongod進程)的(物理)內存使用。
配置完成後重新啓動cgconfig
service cgconfig restart
三、運行mongodb
第一臺主機:
cgexec -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/shard11.conf cgexec -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/shard21.conf cgexec -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/mongosvr.conf /usr/bin/mongos -f /etc/mongodb/mongos.conf
第二臺主機:
cgexec -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/shard12.conf cgexec -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/shard22.conf cgexec -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/mongosvr.conf /usr/bin/mongos -f /etc/mongodb/mongos.conf
地三臺主機:
cgexec -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/arb1.conf cgexec -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/arb2.conf cgexec -g memory:DBLimitedGroup /usr/bin/mongod -f /etc/mongodb/mongosvr.conf /usr/bin/mongos -f /etc/mongodb/mongos.conf
我這裏使用的mongodb的集羣,版本的3.2.4
以下是截圖:
第一臺主機:
第二臺主機:
第三臺主機:
由於本篇講述的是cgroup限制mongo內存,因此mongodb的具體配置不在此列出。