這篇文章將為大家詳細(xì)講解有關(guān)Linux中MongoDB是怎么使用內(nèi)存的,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
目前累計(jì)服務(wù)客戶近千家,積累了豐富的產(chǎn)品開發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹立企業(yè)形象,為客戶提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。創(chuàng)新互聯(lián)始終以務(wù)實(shí)、誠信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過對領(lǐng)先技術(shù)的掌握、對創(chuàng)意設(shè)計(jì)的研究、對客戶形象的視覺傳遞、對應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。Linux如何管理內(nèi)存
在Linux里(別的系統(tǒng)也差不多),內(nèi)存有物理內(nèi)存和虛擬內(nèi)存之說,物理內(nèi)存是什么自然無需解釋,虛擬內(nèi)存實(shí)際是物理內(nèi)存的抽象,多數(shù)情況下,出于方便性的考慮,程序訪問的都是虛擬內(nèi)存地址,然后操作系統(tǒng)會把它翻譯成物理內(nèi)存地址。
很多人會把虛擬內(nèi)存和Swap混為一談,實(shí)際上Swap只是虛擬內(nèi)存引申出的一種技術(shù)而已:操作系統(tǒng)一旦物理內(nèi)存不足,為了騰出內(nèi)存空間存放新內(nèi)容,就會把當(dāng)前物理內(nèi)存中的內(nèi)容放到交換分區(qū)里,稍后用到的時候再取回來,需要注意的是,Swap的使用可能會帶來性能問題,偶爾為之無需緊張,糟糕的是物理內(nèi)存和交換分區(qū)頻繁的發(fā)生數(shù)據(jù)交換,這被稱之為Swap顛簸,一旦發(fā)生這種情況,先要明確是什么原因造成的,如果是內(nèi)存不足就好辦了,加內(nèi)存就可以解決,不過有的時候即使內(nèi)存充足也可能會出現(xiàn)這種問題,比如MySQL就有可能出現(xiàn)這樣的情況,解決方法是限制使用Swap:
shell>sysctl-wvm.swappiness=0
查看內(nèi)存情況最常用的是free命令:
shell>free-m totalusedfreesharedbufferscached Mem:32101293772723023925880 -/+buffers/cache:325828842 Swap:204702047
新手看到used一欄數(shù)值偏大,free一欄數(shù)值偏小,往往會認(rèn)為內(nèi)存要用光了。其實(shí)并非如此,之所以這樣是因?yàn)槊慨?dāng)我們操作文件的時候,Linux都會盡可能的把文件緩存到內(nèi)存里,這樣下次訪問的時候,就可以直接從內(nèi)存中取結(jié)果,所以cached一欄的數(shù)值非常的大,不過不用擔(dān)心,這部分內(nèi)存是可回收的,操作系統(tǒng)會按照LRU算法淘汰冷數(shù)據(jù)。除了cached,還有一個buffers,它和cached類似,也是可回收的,不過它的側(cè)重點(diǎn)在于緩解不同設(shè)備的操作速度不一致造成的阻塞,這里就不多做解釋了。
知道了原理,我們就可以推算出系統(tǒng)可用的內(nèi)存是free+buffers+cached:
shell>echo"2723+239+25880"|bc-l
28842
至于系統(tǒng)實(shí)際使用的內(nèi)存是used–buffers–cached:
shell>echo"29377-239-25880"|bc-l
3258
除了free命令,還可以使用sar命令:
shell>sar-r kbmemfreekbmemused%memusedkbbufferskbcached 32243922964773290.1924611626070160 31163242975580090.5224599226157372 29595202991260491.0024555626316396 27922483007987691.5124568026485672 27182603015386491.7324568426563540 shell>sar-W pswpin/spswpout/s 0.000.00 0.000.00 0.000.00 0.000.00 0.000.00
希望你沒有被%memused嚇到,如果不幸言中,請參考free命令的解釋。
Linux中MongoDB是如何使用內(nèi)存
目前,MongoDB使用的是內(nèi)存映射存儲引擎,它會把磁盤IO操作轉(zhuǎn)換成內(nèi)存操作,如果是讀操作,內(nèi)存中的數(shù)據(jù)起到緩存的作用,如果是寫操作,內(nèi)存還可以把隨機(jī)的寫操作轉(zhuǎn)換成順序的寫操作,總之可以大幅度提升性能。MongoDB并不干涉內(nèi)存管理工作,而是把這些工作留給操作系統(tǒng)的虛擬緩存管理器去處理,這樣的好處是簡化了MongoDB的工作,但壞處是你沒有方法很方便的控制MongoDB占多大內(nèi)存,事實(shí)上MongoDB會占用所有能用的內(nèi)存,所以好不要把別的服務(wù)和MongoDB放一起。
有時候,即便MongoDB使用的是64位操作系統(tǒng),也可能會遭遇臭名昭著的OOM問題,出現(xiàn)這種情況,多半是因?yàn)橄拗屏颂摂M內(nèi)存的大小所致,可以這樣查看當(dāng)前值:
shell>ulimit-a|grep'virtual'
多數(shù)操作系統(tǒng)缺省都是把它設(shè)置成unlimited的,如果你的操作系統(tǒng)不是,可以這樣修改:
shell>ulimit-vunlimited
不過要注意的是,ulimit的使用是有上下文的,好放在MongoDB的啟動腳本里。
有時候,出于某些原因,你可能想釋放掉MongoDB占用的內(nèi)存,不過前面說了,內(nèi)存管理工作是由虛擬內(nèi)存管理器控制的,所以通常你只能通過重啟服務(wù)來釋放內(nèi)存,你一定不齒于這樣的方法,幸好可以使用MongoDB內(nèi)置的closeAllDatabases命令達(dá)到目的:
mongo>useadmin
mongo>db.runCommand({closeAllDatabases:1})
另外,通過調(diào)整內(nèi)核參數(shù)drop_caches也可以釋放緩存:
shell>sysctl-wvm.drop_caches=1
平時可以通過mongo命令行來監(jiān)控MongoDB的內(nèi)存使用情況,如下所示:
mongo>db.serverStatus().mem: { "resident":22346, "virtual":1938524, "mapped":962283 }
還可以通過mongostat命令來監(jiān)控MongoDB的內(nèi)存使用情況,如下所示:
shell>mongostat mappedvsizeresfaults 940g1893g21.9g0 940g1893g21.9g0 940g1893g21.9g0 940g1893g21.9g0 940g1893g21.9g0
其中內(nèi)存相關(guān)字段的含義是:
mapped:映射到內(nèi)存的數(shù)據(jù)大小
visze:占用的虛擬內(nèi)存大小
res:實(shí)際使用的內(nèi)存大小
注:如果操作不能再內(nèi)存中完成,結(jié)果faults列的數(shù)值不會是0,視大小可能有性能問題。
在上面的結(jié)果中,vsize是mapped的兩倍,而mapped等于數(shù)據(jù)文件的大小,所以說vsize是數(shù)據(jù)文件的兩倍,之所以會這樣,是因?yàn)楸纠?,MongoDB開啟了journal,需要在內(nèi)存里多映射一次數(shù)據(jù)文件,如果關(guān)閉journal,則vsize和mapped大致相當(dāng)。
如果想驗(yàn)證這一點(diǎn),可以在開啟或關(guān)閉journal后,通過pmap命令來觀察文件映射情況:
shell>pmap$(pidofmongod)
到底MongoDB配備多大內(nèi)存合適?寬泛點(diǎn)來說,多多益善,如果要確切點(diǎn)來說,這實(shí)際取決于你的數(shù)據(jù)及索引的大小,內(nèi)存如果能夠裝下全部數(shù)據(jù)加索引是很好情況,不過很多時候,數(shù)據(jù)都會比內(nèi)存大,比如本文說涉及的MongoDB實(shí)例:
mongo>db.stats() { "dataSize":1004862191980, "indexSize":1335929664 }
本例中索引只有1G多,內(nèi)存完全能裝下,而數(shù)據(jù)文件則達(dá)到了1T,估計(jì)很難找到這么大內(nèi)存,此時保證內(nèi)存能裝下熱數(shù)據(jù)即可,至于熱數(shù)據(jù)有多少,這就是個比例問題了,取決于具體的應(yīng)用。如此一來內(nèi)存大小就明確了:內(nèi)存>索引+熱數(shù)據(jù)。
關(guān)于“Linux中MongoDB是怎么使用內(nèi)存的”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
本文標(biāo)題:Linux中MongoDB是怎么使用內(nèi)存的-創(chuàng)新互聯(lián)
URL分享:http://m.rwnh.cn/article10/iiedo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、微信公眾號、品牌網(wǎng)站建設(shè)、軟件開發(fā)、手機(jī)網(wǎng)站建設(shè)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容