mongodb釋放記憶體-切換日誌
由於碰到過mongodb吃掉所有閒置記憶體的情況,導致伺服器操作越來越慢。雖然對mongodb的讀操作沒有太多影響,
但是此時寫入的效能卻極劇下降(懷疑記憶體不夠引起的)。由於要收集大量的歷史檔案資料,
每次多執行緒收集到一定的程度時,寫入檔案速度越來越慢,經過多次測試發現,均與服務記憶體的使用峰值有關。
當伺服器記憶體使用率較低時,多執行緒寫入較快,當伺服器記憶體被mongodb 對映耗盡時,多執行緒寫入速度慢到慘不忍賭了,
即使是單執行緒情況這種情況表現也很明顯。雖然mongodb提供了runCommnad({closeAllDatabase:1})或關閉資料庫釋放快取。
mongo>use admin
switched to db admin
mongo>db.runCommand({closeAllDatabases:1})
但是這卻影響到了正常讀寫操作。因此給伺服器預留一定的記憶體空間成了保障快速寫入的一個方案,
當然在正常情況下不會出現如此頻率的檔案寫入操作,只是現在面對的情況特殊,是要收集大量歷史的檔案。
=====================================================================================================
平時可以透過mongo命令列來監控MongoDB的記憶體使用情況,如下所示:
mongo> db.serverStatus().mem:
{
"resident" : 22346,
"virtual" : 1938524,
"mapped" : 962283
}還可以透過mongostat命令來監控MongoDB的記憶體使用情況,如下所示:
shell> mongostat
mapped vsize res faults
940g 1893g 21.9g 0其中記憶體相關欄位的含義是:
mapped:對映到記憶體的資料大小
visze:佔用的虛擬記憶體大小
res:佔用的實體記憶體大小
注:如果操作不能在記憶體中完成,結果faults列的數值不會是0,視大小可能有效能問題。
在上面的結果中,vsize是mapped的兩倍,而mapped等於資料檔案的大小,所以說vsize是資料檔案的兩倍,
之所以會這樣,是因為本例中,MongoDB開啟了journal,需要在記憶體裡多對映一次資料檔案,如果關閉journal,
則vsize和mapped大致相當。
==================================================================================
檢視記憶體情況最常用的是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一欄數值偏大,free一欄數值偏小,
往往會認為記憶體要用光了。其實並非如此,之所以這樣是因為每當我們操作檔案的時候,
Linux都會盡可能的把檔案快取到記憶體裡,這樣下次訪問的時候,就可以直接從記憶體中取結果,
所以cached一欄的數值非常的大,不過不用擔心,這部分記憶體是可回收的,
作業系統的虛擬記憶體管理器會按照LRU演算法淘汰冷資料。還有一個buffers,也是可回收的,不過它是保留給塊裝置使用的。
知道了原理,我們就可以推算出系統可用的記憶體是free + buffers + cached:
shell> echo $((2723 + 239 + 25880))
28842至於系統實際使用的記憶體是used – buffers – cached:
shell> echo $((29377 - 239 - 25880))
3258
####切換日誌
use admin
db.runCommand("logRotate")
但是此時寫入的效能卻極劇下降(懷疑記憶體不夠引起的)。由於要收集大量的歷史檔案資料,
每次多執行緒收集到一定的程度時,寫入檔案速度越來越慢,經過多次測試發現,均與服務記憶體的使用峰值有關。
當伺服器記憶體使用率較低時,多執行緒寫入較快,當伺服器記憶體被mongodb 對映耗盡時,多執行緒寫入速度慢到慘不忍賭了,
即使是單執行緒情況這種情況表現也很明顯。雖然mongodb提供了runCommnad({closeAllDatabase:1})或關閉資料庫釋放快取。
mongo>use admin
switched to db admin
mongo>db.runCommand({closeAllDatabases:1})
但是這卻影響到了正常讀寫操作。因此給伺服器預留一定的記憶體空間成了保障快速寫入的一個方案,
當然在正常情況下不會出現如此頻率的檔案寫入操作,只是現在面對的情況特殊,是要收集大量歷史的檔案。
=====================================================================================================
平時可以透過mongo命令列來監控MongoDB的記憶體使用情況,如下所示:
mongo> db.serverStatus().mem:
{
"resident" : 22346,
"virtual" : 1938524,
"mapped" : 962283
}還可以透過mongostat命令來監控MongoDB的記憶體使用情況,如下所示:
shell> mongostat
mapped vsize res faults
940g 1893g 21.9g 0其中記憶體相關欄位的含義是:
mapped:對映到記憶體的資料大小
visze:佔用的虛擬記憶體大小
res:佔用的實體記憶體大小
注:如果操作不能在記憶體中完成,結果faults列的數值不會是0,視大小可能有效能問題。
在上面的結果中,vsize是mapped的兩倍,而mapped等於資料檔案的大小,所以說vsize是資料檔案的兩倍,
之所以會這樣,是因為本例中,MongoDB開啟了journal,需要在記憶體裡多對映一次資料檔案,如果關閉journal,
則vsize和mapped大致相當。
==================================================================================
檢視記憶體情況最常用的是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一欄數值偏大,free一欄數值偏小,
往往會認為記憶體要用光了。其實並非如此,之所以這樣是因為每當我們操作檔案的時候,
Linux都會盡可能的把檔案快取到記憶體裡,這樣下次訪問的時候,就可以直接從記憶體中取結果,
所以cached一欄的數值非常的大,不過不用擔心,這部分記憶體是可回收的,
作業系統的虛擬記憶體管理器會按照LRU演算法淘汰冷資料。還有一個buffers,也是可回收的,不過它是保留給塊裝置使用的。
知道了原理,我們就可以推算出系統可用的記憶體是free + buffers + cached:
shell> echo $((2723 + 239 + 25880))
28842至於系統實際使用的記憶體是used – buffers – cached:
shell> echo $((29377 - 239 - 25880))
3258
####切換日誌
use admin
db.runCommand("logRotate")
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-1875028/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL切換日誌SQL
- Linux釋放記憶體及手動釋放Oracle共享記憶體段Linux記憶體Oracle
- vector 的記憶體釋放記憶體
- XCode釋放記憶體XCode記憶體
- linux釋放記憶體Linux記憶體
- vector 避免記憶體頻繁分配釋放與手動釋放vector記憶體記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- Oracle日誌模式切換Oracle模式
- 轉 linux 記憶體釋放Linux記憶體
- Linux釋放cache記憶體Linux記憶體
- linux 記憶體釋放命令Linux記憶體
- REDO日誌切換頻率
- C# 垃圾回收釋放記憶體C#記憶體
- 正確釋放Vector的記憶體記憶體
- FireFox記憶體自動釋放Firefox記憶體
- dataguard之物理standby 日誌切換
- golang 釋放記憶體機制的探索Golang記憶體
- vector clear() 方法 記憶體釋放問題記憶體
- C/C++記憶體分配以及釋放C++記憶體
- Linux之 手動釋放記憶體Linux記憶體
- Linux下如何釋放cache記憶體Linux記憶體
- Linux系統釋放cache記憶體Linux記憶體
- 如何主動釋放 HeapIdle 的記憶體API記憶體
- Linux手動釋放快取記憶體Linux快取記憶體
- Android-Fragment 切換造成記憶體溢位,導致記憶體增長AndroidFragment記憶體溢位
- oracle rman備份歸檔日誌需要先切換日誌嗎Oracle
- 針對持久記憶體的後寫日誌記憶體
- 共享記憶體段未釋放導致資料庫記憶體被耗盡記憶體資料庫
- Vector() 記憶體釋放 不得不說的故事記憶體
- C++ vector 釋放記憶體的兩種方法C++記憶體
- 如何釋放linux cache佔用的記憶體Linux記憶體
- android釋放記憶體的一個辦法Android記憶體
- 簡單分配和釋放記憶體指令碼[更新]記憶體指令碼
- SpringBoot切換預設日誌框架Spring Boot框架
- 【備份恢復】set newname切換日誌
- Oracle redo 日誌切換時間頻率Oracle Redo
- 日誌檔案和歸檔日誌檔案的關係以及如何切換日誌
- 記錄一下,linux釋放記憶體的方法Linux記憶體