青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

攀升·Uranus


Something Different,Something New
數(shù)據(jù)加載中……

(轉(zhuǎn))MongoDB與內(nèi)存

@import url(http://www.shnenglu.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

MongoDB與內(nèi)存

但凡初次接觸MongoDB的人,無(wú)不驚訝于它對(duì)內(nèi)存的貪得無(wú)厭,至于個(gè)中緣由,我先講講Linux是如何管理內(nèi)存的,再說(shuō)說(shuō)MongoDB是如何使用內(nèi)存的,答案自然就清楚了。

據(jù)說(shuō)帶著問(wèn)題學(xué)習(xí)更有效,那就先看一個(gè)MongoDB服務(wù)器的top命令結(jié)果:

shell> top -p $(pidof mongod)
Mem:  32872124k total, 30065320k used,  2806804k free,   245020k buffers
Swap:  2097144k total,      100k used,  2097044k free, 26482048k cached
VIRT  RES  SHR %MEM
1892g  21g  21g 69.6

這臺(tái)MongoDB服務(wù)器有沒(méi)有性能問(wèn)題?大家可以一邊思考一邊繼續(xù)閱讀。

先講講Linux是如何管理內(nèi)存的

在Linux里(別的系統(tǒng)也差不多),內(nèi)存有物理內(nèi)存和虛擬內(nèi)存之說(shuō),物理內(nèi)存是什么自然無(wú)需解釋,虛擬內(nèi)存實(shí)際是物理內(nèi)存的抽象,多數(shù)情況下,出于方便性的考慮,程序訪問(wèn)的都是虛擬內(nèi)存地址,然后操作系統(tǒng)會(huì)通過(guò)Page Table機(jī)制把它翻譯成物理內(nèi)存地址,詳細(xì)說(shuō)明可以參考Understanding MemoryUnderstanding Virtual Memory,至于程序是如何使用虛擬內(nèi)存的,可以參考Playing with Virtual Memory,這里就不多費(fèi)口舌了。

很多人會(huì)把虛擬內(nèi)存和Swap混為一談,實(shí)際上Swap只是虛擬內(nèi)存引申出的一種技術(shù)而已:操作系統(tǒng)一旦物理內(nèi)存不足,為了騰出內(nèi)存空間存放新內(nèi)容,就會(huì)把當(dāng)前物理內(nèi)存中的內(nèi)容放到交換分區(qū)里,稍后用到的時(shí)候再取回來(lái),需要注意的是,Swap的使用可能會(huì)帶來(lái)性能問(wèn)題,偶爾為之無(wú)需緊張,糟糕的是物理內(nèi)存和交換分區(qū)頻繁的發(fā)生數(shù)據(jù)交換,這被稱之為Swap顛簸,一旦發(fā)生這種情況,先要明確是什么原因造成的,如果是內(nèi)存不足就好辦了,加內(nèi)存就可以解決,不過(guò)有的時(shí)候即使內(nèi)存充足也可能會(huì)出現(xiàn)這種問(wèn)題,比如MySQL就有可能出現(xiàn)這樣的情況,一個(gè)可選的解決方法是限制使用Swap:

shell> sysctl -w vm.swappiness=0

查看內(nèi)存情況最常用的是free命令:

shell> free -m
total       used       free     shared    buffers     cached
Mem:         32101      29377       2723          0        239      25880
-/+ buffers/cache:       3258      28842
Swap:         2047          0       2047

新手看到used一欄數(shù)值偏大,free一欄數(shù)值偏小,往往會(huì)認(rèn)為內(nèi)存要用光了。其實(shí)并非如此,之所以這樣是因?yàn)槊慨?dāng)我們操作文件的時(shí)候,Linux都會(huì)盡可能的把文件緩存到內(nèi)存里,這樣下次訪問(wèn)的時(shí)候,就可以直接從內(nèi)存中取結(jié)果,所以cached一欄的數(shù)值非常的大,不過(guò)不用擔(dān)心,這部分內(nèi)存是可回收的,操作系統(tǒng)的虛擬內(nèi)存管理器會(huì)按照LRU算法淘汰冷數(shù)據(jù)。還有一個(gè)buffers,也是可回收的,不過(guò)它是保留給塊設(shè)備使用的。

知道了原理,我們就可以推算出系統(tǒng)可用的內(nèi)存是free + buffers + cached:

shell> echo $((2723 + 239 + 25880))
28842

至于系統(tǒng)實(shí)際使用的內(nèi)存是used – buffers – cached:

shell> echo $((29377 - 239 - 25880))
3258

除了free命令,還可以使用sar命令:

shell> sar -r
kbmemfree kbmemused  %memused kbbuffers  kbcached
3224392  29647732     90.19    246116  26070160
shell> sar -W
pswpin/s pswpout/s
0.00      0.00

希望你沒(méi)有被%memused嚇到,如果不幸言中,重讀本文。

再說(shuō)說(shuō)MongoDB是如何使用內(nèi)存的

目前,MongoDB使用的是內(nèi)存映射存儲(chǔ)引擎,它會(huì)把數(shù)據(jù)文件映射到內(nèi)存中,如果是讀操作,內(nèi)存中的數(shù)據(jù)起到緩存的作用,如果是寫(xiě)操作,內(nèi)存還可以把隨機(jī)的寫(xiě)操作轉(zhuǎn)換成順序的寫(xiě)操作,總之可以大幅度提升性能。MongoDB并不干涉內(nèi)存管理工作,而是把這些工作留給操作系統(tǒng)的虛擬內(nèi)存管理器去處理,這樣做的好處是簡(jiǎn)化了MongoDB的工作,但壞處是你沒(méi)有方法很方便的控制MongoDB占多大內(nèi)存,幸運(yùn)的是虛擬內(nèi)存管理器的存在讓我們多數(shù)時(shí)候并不需要關(guān)心這個(gè)問(wèn)題。

MongoDB的內(nèi)存使用機(jī)制讓它在緩存重建方面更有優(yōu)勢(shì),簡(jiǎn)而言之:如果重啟進(jìn)程,那么緩存依然有效,如果重啟系統(tǒng),那么可以通過(guò)拷貝數(shù)據(jù)文件到/dev/null的方式來(lái)重建緩存,更詳細(xì)的描述請(qǐng)參考:Cache Reheating – Not to be Ignored

有時(shí)候,即便MongoDB使用的是64位操作系統(tǒng),也可能會(huì)遭遇OOM問(wèn)題,出現(xiàn)這種情況,多半是因?yàn)橄拗屏藘?nèi)存的大小所致,可以這樣查看當(dāng)前值:

shell> ulimit -a | grep memory

多數(shù)操作系統(tǒng)缺省都是把它設(shè)置成unlimited的,如果你的操作系統(tǒng)不是,可以這樣修改:

shell> ulimit -m unlimited
shell> ulimit -v unlimited

注:ulimit的使用是有上下文的,最好放在MongoDB的啟動(dòng)腳本里。

有時(shí)候,MongoDB連接數(shù)過(guò)多的話,會(huì)拖累性能,可以通過(guò)serverStatus查詢連接數(shù):

mongo> db.serverStatus().connections

每個(gè)連接都是一個(gè)線程,需要一個(gè)Stack,Linux下缺省的Stack設(shè)置一般比較大:

shell> ulimit -a | grep stack
stack size              (kbytes, -s) 10240

至于MongoDB實(shí)際使用的Stack大小,可以用如下命令確認(rèn)(單位:K):

shell> cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}'

如果Stack過(guò)大(比如:10240K)的話沒(méi)有意義,簡(jiǎn)單對(duì)照命令結(jié)果中的Size和Rss:

shell> cat /proc/$(pidof mongod)/smaps | grep 10240 -A 10

所有連接消耗的內(nèi)存加起來(lái)會(huì)相當(dāng)驚人,推薦把Stack設(shè)置小一點(diǎn),比如說(shuō)1024:

shell> ulimit -s 1024

注:從MongoDB1.8.3開(kāi)始,MongoDB會(huì)在啟動(dòng)時(shí)自動(dòng)設(shè)置Stack。

有時(shí)候,出于某些原因,你可能想釋放掉MongoDB占用的內(nèi)存,不過(guò)前面說(shuō)了,內(nèi)存管理工作是由虛擬內(nèi)存管理器控制的,幸好可以使用MongoDB內(nèi)置的closeAllDatabases命令達(dá)到目的:

mongo> use admin
mongo> db.runCommand({closeAllDatabases:1})

另外,通過(guò)調(diào)整內(nèi)核參數(shù)drop_caches也可以釋放緩存:

shell> sysctl -w vm.drop_caches=1

平時(shí)可以通過(guò)mongo命令行來(lái)監(jiān)控MongoDB的內(nèi)存使用情況,如下所示:

mongo> db.serverStatus().mem:
{
"resident" : 22346,
"virtual" : 1938524,
"mapped" : 962283
}

還可以通過(guò)mongostat命令來(lái)監(jiān)控MongoDB的內(nèi)存使用情況,如下所示:

shell> mongostat
mapped  vsize    res faults
940g  1893g  21.9g      0

其中內(nèi)存相關(guān)字段的含義是:

  • mapped:映射到內(nèi)存的數(shù)據(jù)大小
  • visze:占用的虛擬內(nèi)存大小
  • res:占用的物理內(nèi)存大小

注:如果操作不能在內(nèi)存中完成,結(jié)果faults列的數(shù)值不會(huì)是0,視大小可能有性能問(wèn)題。

在上面的結(jié)果中,vsize是mapped的兩倍,而mapped等于數(shù)據(jù)文件的大小,所以說(shuō)vsize是數(shù)據(jù)文件的兩倍,之所以會(huì)這樣,是因?yàn)楸纠校琈ongoDB開(kāi)啟了journal,需要在內(nèi)存里多映射一次數(shù)據(jù)文件,如果關(guān)閉journal,則vsize和mapped大致相當(dāng)。

如果想驗(yàn)證這一點(diǎn),可以在開(kāi)啟或關(guān)閉journal后,通過(guò)pmap命令來(lái)觀察文件映射情況:

shell> pmap $(pidof mongod)

到底MongoDB配備多大內(nèi)存合適?寬泛點(diǎn)來(lái)說(shuō),多多益善,如果要確切點(diǎn)來(lái)說(shuō),這實(shí)際取決于你的數(shù)據(jù)及索引的大小,內(nèi)存如果能夠裝下全部數(shù)據(jù)加索引是最佳情況,不過(guò)很多時(shí)候,數(shù)據(jù)都會(huì)比內(nèi)存大,比如本文所涉及的MongoDB實(shí)例:

mongo> db.stats()
{
"dataSize" : 1004862191980,
"indexSize" : 1335929664
}

本例中索引只有1G多,內(nèi)存完全能裝下,而數(shù)據(jù)文件則達(dá)到了1T,估計(jì)很難找到這么大內(nèi)存,此時(shí)保證內(nèi)存能裝下熱數(shù)據(jù)即可,至于熱數(shù)據(jù)是多少,取決于具體的應(yīng)用,你也可以通過(guò)觀察faults的大小來(lái)判斷當(dāng)前內(nèi)存是否能夠裝下熱數(shù)據(jù),如果faults持續(xù)變大,就說(shuō)明當(dāng)前內(nèi)存已經(jīng)不能滿足熱數(shù)據(jù)的大小了。如此一來(lái)內(nèi)存大小就明確了:內(nèi)存 > 索引 + 熱數(shù)據(jù),最好有點(diǎn)富余,畢竟操作系統(tǒng)本身正常運(yùn)轉(zhuǎn)也需要消耗一部分內(nèi)存。

關(guān)于MongoDB與內(nèi)存的話題,大家還可以參考官方文檔中的相關(guān)介紹。

@import url(http://www.shnenglu.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

posted on 2012-08-06 13:36 攀升 閱讀(1819) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲巨乳在线| 欧美午夜在线观看| 中文久久精品| 久热精品视频在线免费观看| 亚洲欧洲久久| 国产精品一级久久久| 久久性天堂网| 亚洲天堂成人在线观看| 亚洲精品之草原avav久久| 免费观看久久久4p| 久久精品国产清高在天天线| 亚洲一区在线直播| 一本色道久久精品| 亚洲美女毛片| 亚洲激情成人在线| 在线国产日韩| 韩国av一区| 国产亚洲一区在线| 国产女同一区二区| 国产精品女主播一区二区三区| 欧美精品免费播放| 欧美搞黄网站| 欧美国产日韩一区二区在线观看| 美国十次成人| 蜜臀av性久久久久蜜臀aⅴ| 久久久免费av| 久久夜色撩人精品| 久久亚洲精品伦理| 久久午夜av| 久久综合中文字幕| 美乳少妇欧美精品| 嫩模写真一区二区三区三州| 免费看成人av| 欧美成人精品高清在线播放| 嫩草影视亚洲| 欧美精品成人| 欧美肉体xxxx裸体137大胆| 欧美日韩在线视频首页| 欧美视频在线观看一区| 国产精品v亚洲精品v日韩精品 | 老司机精品视频网站| 久久精品系列| 老司机免费视频久久| 欧美jizz19性欧美| 欧美成人亚洲成人日韩成人| 欧美了一区在线观看| 欧美日韩亚洲国产精品| 国产精品爱久久久久久久| 国产精品久久久久影院亚瑟 | 亚洲福利视频专区| 亚洲国产高清在线| 99一区二区| 亚洲欧洲av一区二区| 久久久综合网站| 亚洲国产乱码最新视频| 亚洲精品一区二区三区蜜桃久| 99伊人成综合| 欧美中日韩免费视频| 美女网站在线免费欧美精品| 欧美破处大片在线视频| 国产精品美女久久久浪潮软件| 国产日韩欧美精品一区| 亚洲电影观看| 亚洲一区二区三区在线视频| 欧美在线关看| 亚洲国产精品123| 亚洲天堂免费观看| 久久蜜桃香蕉精品一区二区三区| 欧美激情亚洲激情| 国产日本欧美一区二区三区| 91久久极品少妇xxxxⅹ软件| 亚洲欧美成人精品| 欧美成人精品在线观看| 一区二区三区四区在线| 久久精品91久久香蕉加勒比| 欧美区日韩区| 狠狠色综合网| 亚洲午夜羞羞片| 欧美 日韩 国产一区二区在线视频| 亚洲精品三级| 久久国产主播| 欧美视频四区| 亚洲国产精品久久久久久女王| 中文精品视频一区二区在线观看| 久久久国产成人精品| 亚洲日本va午夜在线影院| 亚洲欧美成人精品| 欧美精品自拍| 一区二区三区在线免费视频| 亚洲午夜激情免费视频| 女人天堂亚洲aⅴ在线观看| 亚洲视频在线观看视频| 欧美黄色网络| 在线观看日韩专区| 欧美在线日韩精品| 99在线精品视频| 欧美成人情趣视频| 激情综合视频| 欧美一区二区三区在线| 一本色道久久综合亚洲精品小说 | 国产精品高清一区二区三区| 亚洲高清中文字幕| 久久久久9999亚洲精品| 亚洲视频综合| 欧美日韩国产在线播放网站| 亚洲激情成人| 美女啪啪无遮挡免费久久网站| 亚洲特黄一级片| 欧美日韩在线另类| 99亚洲精品| 亚洲欧洲一区二区天堂久久 | 国产精品入口夜色视频大尺度| 亚洲免费精品| 亚洲国产精品ⅴa在线观看| 久久日韩粉嫩一区二区三区| 国产一区二区无遮挡| 久久aⅴ乱码一区二区三区| 亚洲午夜高清视频| 国产精品久久久久9999高清 | 欧美在线亚洲一区| 国产日韩欧美91| 性欧美暴力猛交69hd| 亚洲婷婷在线| 国产精品久久久久久久久果冻传媒| 中日韩视频在线观看| 日韩视频免费观看| 欧美久久一级| 一区二区三区成人| 夜夜精品视频一区二区| 欧美午夜激情在线| 亚洲欧美日韩另类| 午夜精品一区二区三区在线视| 国产精品免费区二区三区观看| 亚洲欧美成人综合| 午夜天堂精品久久久久| 国产一区二区看久久| 久久人人爽人人| 美女免费视频一区| 亚洲精品久久| 99热精品在线观看| 国产精品视频精品| 久久久久久穴| 男人插女人欧美| 一区二区三区四区在线| 亚洲一级二级在线| 国产专区一区| 欧美韩日一区| 欧美日韩在线播放三区| 欧美在线免费播放| 久久久久久夜精品精品免费| 亚洲欧洲日产国产网站| 日韩视频精品在线观看| 国产精品亚洲综合天堂夜夜| 久久亚洲精品中文字幕冲田杏梨| 久久性天堂网| 亚洲无线视频| 欧美在线三区| 亚洲毛片在线看| 亚洲在线第一页| 黄色一区二区三区四区| 亚洲国产精品成人一区二区 | 亚洲精品日韩在线观看| 99视频精品在线| 国产自产2019最新不卡| 亚洲激情在线| 国产女优一区| 亚洲国产精品一区二区久| 国产精品国产馆在线真实露脸| 久久综合伊人77777| 欧美日韩精品一区二区天天拍小说| 亚洲综合精品一区二区| 久久久九九九九| 亚洲自拍电影| 乱码第一页成人| 亚洲自拍电影| 嫩草影视亚洲| 久久精品免费观看| 欧美人妖另类| 久久久亚洲国产天美传媒修理工| 欧美精品久久久久久久久久| 久久精品国产成人| 欧美日韩国产一区二区三区地区| 久久久精品动漫| 欧美视频导航| 亚洲大胆在线| 黄色亚洲在线| 亚洲一区二区三区视频| 亚洲免费观看| 久久嫩草精品久久久久| 欧美亚洲一级片| 欧美日韩一区二区三区| 欧美大尺度在线| 国产一区二区视频在线观看| 在线综合欧美| 99国产麻豆精品| 欧美不卡视频一区| 麻豆成人综合网| 国产午夜亚洲精品不卡| 亚洲小少妇裸体bbw| 一区二区三区回区在观看免费视频|