重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
純手打,只是總結了通過多種方式查看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,每次看到內存比較大的時候,采用的辦法就是重啟服務,但是這并不能解決問題,只是暫緩問題,有解決辦法的麻煩告知一聲,跪謝。
另外有需要云服務器可以了解下創新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。