純手打,只是總結(jié)了通過(guò)多種方式查看mongodb的內(nèi)存使用情況,并沒(méi)能提出有效的減少mongodb的內(nèi)存的方法。
創(chuàng)新互聯(lián)建站成立以來(lái)不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點(diǎn),以客戶需求中心、市場(chǎng)為導(dǎo)向”的快速反應(yīng)體系。對(duì)公司的主營(yíng)項(xiàng)目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計(jì)、行業(yè) / 企業(yè)門(mén)戶設(shè)計(jì)推廣、行業(yè)門(mén)戶平臺(tái)運(yùn)營(yíng)、重慶APP開(kāi)發(fā)公司、手機(jī)網(wǎng)站開(kāi)發(fā)、微信網(wǎng)站制作、軟件開(kāi)發(fā)、綿陽(yáng)機(jī)房托管等實(shí)行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從創(chuàng)新互聯(lián)建站可以獲得的服務(wù)效果。都說(shuō)mongodb吃內(nèi)存比較厲害,確實(shí)很厲害,我的數(shù)據(jù)級(jí)別到達(dá)了 4千萬(wàn),數(shù)據(jù)量大概是140G,幾天下來(lái)的話,130G的內(nèi)存盤(pán),到了60%,沒(méi)有找到很好的辦法前,每次都是重啟mongodb,新手,我也不太清楚這個(gè)數(shù)據(jù)量是處于一個(gè)怎樣的位置,有怎樣的優(yōu)良的解決辦法,知道的麻煩告知一下,跪謝。
為啥這么吃內(nèi)存呢,mongodb使用的是內(nèi)存映射存儲(chǔ)引擎,即Memory Mapped Storage Engine,簡(jiǎn)稱MMAP,MMAP可以把磁盤(pán)文件的一部分或全部?jī)?nèi)容直接映射到內(nèi)存,這樣文件中的信息位置就會(huì)在內(nèi)存中有對(duì)應(yīng)的地址空間,把磁盤(pán)IO操作轉(zhuǎn)換成內(nèi)存操作,
但壞處是你沒(méi)有方法很方便的控制MongoDB占多大內(nèi)存,事實(shí)上MongoDB會(huì)占用所有能用的內(nèi)存,所以最好不要把別的服務(wù)和MongoDB放一起。之所以會(huì)有這個(gè)總結(jié),就是因?yàn)樵?jīng)將web服務(wù)與mongodb放在一起,導(dǎo)致負(fù)載間歇性的劇增,web服務(wù)直接被服務(wù)器自動(dòng)重啟了,當(dāng)然這是后話。
如果想知道m(xù)ongodb的內(nèi)存使用情況,可以有一些幾個(gè)操作:
top
shift+m,如果不出意外的話,mongodb應(yīng)該居于首位了,
VIRT:虛擬內(nèi)存
RES:實(shí)際使用內(nèi)存
%MEM:內(nèi)存使用比
剛重啟過(guò),內(nèi)存占用還不算多
2.mongostat
mapped:映射到內(nèi)存的數(shù)據(jù)大小,
vsize:虛擬內(nèi)存,是mapped的2倍
res: 實(shí)際使用的內(nèi)存,如果res經(jīng)常突然下降,去查查是否有別的程序狂吃內(nèi)存
conn:當(dāng)前的連接數(shù)
這里的vsize,res與top的一致,conn如果一直都很高的話,也是有問(wèn)題的,lockedb如果很高的話(經(jīng)常超過(guò)),說(shuō)明有問(wèn)題很大了,曾經(jīng)因?yàn)楹芏鄍ython腳本規(guī)定時(shí)間跑不完,導(dǎo)致連接一個(gè)接著一個(gè),最終lockdb到了50%
3.db.stats()
db:當(dāng)前數(shù)據(jù)庫(kù)
collections:當(dāng)前數(shù)據(jù)多少?gòu)埍?/p>
objects:當(dāng)前數(shù)據(jù)庫(kù)所有表多少條數(shù)據(jù)
dataSize:所有數(shù)據(jù)的總大小
storageSize:所有數(shù)據(jù)占的磁盤(pán)大小
indexes:索引數(shù)
indexSize:索引大小
fileSize:預(yù)分配給數(shù)據(jù)庫(kù)的文件大小
其實(shí)這個(gè)并不能說(shuō)顯示內(nèi)存的什么情況,只能說(shuō)能顯示整個(gè)數(shù)據(jù)庫(kù)的一個(gè)狀態(tài)status
4.db.serverStatus()
這個(gè)命令在單獨(dú)的個(gè)別db中,并不能顯示出任何結(jié)果,需要在admin 這個(gè)db中才有效,測(cè)試可以看到很多信息顯示,如connections,current為當(dāng)前的連接,available為可用的連接
我們常用的話,不會(huì)顯示這么多的信息,一般需要什么就顯示什么。如內(nèi)存使用情況
5.db.serverStatus().mem
virtual:虛擬內(nèi)存的大小
mapped:映射到內(nèi)存的數(shù)據(jù)大小
這里虛擬內(nèi)存是mapped的兩倍,是因?yàn)槲覀冮_(kāi)啟了Journal日志,需要在內(nèi)存中多映射一次,大概就是它的兩倍了。如果關(guān)閉Journal日志,虛擬內(nèi)存大小將和mapped大小相當(dāng)
我常用的大概就是top和mongostat,每次看到內(nèi)存比較大的時(shí)候,采用的辦法就是重啟服務(wù),但是這并不能解決問(wèn)題,只是暫緩問(wèn)題,有解決辦法的麻煩告知一聲,跪謝。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。