您好,登錄后才能下訂單哦!
純手打,只是總結了通過多種方式查看mongodb的內存使用情況,并沒能提出有效的減少mongodb的內存的方法。
都說mongodb吃內存比較厲害,確實很厲害,我的數據級別到達了 4千萬,數據量大概是140G,幾天下來的話,130G的內存盤,到了60%,沒有找到很好的辦法前,每次都是重啟mongodb,新手,我也不太清楚這個數據量是處于一個怎樣的位置,有怎樣的優良的解決辦法,知道的麻煩告知一下,跪謝。
為啥這么吃內存呢,mongodb使用的是內存映射存儲引擎,即Memory Mapped Storage Engine,簡稱MMAP,MMAP可以把磁盤文件的一部分或全部內容直接映射到內存,這樣文件中的信息位置就會在內存中有對應的地址空間,把磁盤IO操作轉換成內存操作,
但壞處是你沒有方法很方便的控制MongoDB占多大內存,事實上MongoDB會占用所有能用的內存,所以最好不要把別的服務和MongoDB放一起。之所以會有這個總結,就是因為曾經將web服務與mongodb放在一起,導致負載間歇性的劇增,web服務直接被服務器自動重啟了,當然這是后話。
如果想知道mongodb的內存使用情況,可以有一些幾個操作:
top
shift+m,如果不出意外的話,mongodb應該居于首位了,
VIRT:虛擬內存
RES:實際使用內存
%MEM:內存使用比
剛重啟過,內存占用還不算多
2.mongostat
mapped:映射到內存的數據大小,
vsize:虛擬內存,是mapped的2倍
res: 實際使用的內存,如果res經常突然下降,去查查是否有別的程序狂吃內存
conn:當前的連接數
這里的vsize,res與top的一致,conn如果一直都很高的話,也是有問題的,lockedb如果很高的話(經常超過),說明有問題很大了,曾經因為很多python腳本規定時間跑不完,導致連接一個接著一個,最終lockdb到了50%
3.db.stats()
db:當前數據庫
collections:當前數據多少張表
objects:當前數據庫所有表多少條數據
dataSize:所有數據的總大小
storageSize:所有數據占的磁盤大小
indexes:索引數
indexSize:索引大小
fileSize:預分配給數據庫的文件大小
其實這個并不能說顯示內存的什么情況,只能說能顯示整個數據庫的一個狀態status
4.db.serverStatus()
這個命令在單獨的個別db中,并不能顯示出任何結果,需要在admin 這個db中才有效,測試可以看到很多信息顯示,如connections,current為當前的連接,available為可用的連接
我們常用的話,不會顯示這么多的信息,一般需要什么就顯示什么。如內存使用情況
5.db.serverStatus().mem
virtual:虛擬內存的大小
mapped:映射到內存的數據大小
這里虛擬內存是mapped的兩倍,是因為我們開啟了Journal日志,需要在內存中多映射一次,大概就是它的兩倍了。如果關閉Journal日志,虛擬內存大小將和mapped大小相當
我常用的大概就是top和mongostat,每次看到內存比較大的時候,采用的辦法就是重啟服務,但是這并不能解決問題,只是暫緩問題,有解決辦法的麻煩告知一聲,跪謝。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。