MongoDB 失敗並出現 SymInitialize 錯誤,除非 Windows 中存在非常大的頁面文件
我想知道是否有人可以幫助我們解決我們似乎遇到的 MongoDB/頁面文件問題,因為我們的數據庫隨著時間的推移而增加。MongoDB 會時不時地在我們的副本集中的特定節點上崩潰,並且在我們顯著增加(雙倍是安全的)我們的頁面文件大小之前它不會重新啟動。目前,頁面文件為 42GB。我們將 MongoDB 作為 3 節點副本集執行,每個節點都在 Azure 中的 Windows Server 2012 R2 虛擬機上執行。每台伺服器都有 3.5 GB 的記憶體。MongoDB 是 2.6.5 版。
我已經看過下面的相關文章,並且我知道 MongoDB 使用記憶體映射文件,並且當我們沒有大量 RAM 時,虛擬記憶體可能會對此有所幫助。我不明白的是:
為什麼 MongoDB 在啟動時需要這麼多記憶體(對於 131GB 的數據庫來說 >32GB 頁面文件)並且工作集相對較小(~100MB)?大概它可以根據需要交換文件,尤其是對於這麼大的頁面文件,那麼為什麼 MongoDB 會崩潰?
以下是我到目前為止找到的文章:
和這個
SERVER-10044解釋了為什麼 Mongo 崩潰並暗示 VM 更糟
提前感謝您的幫助。
為了提供更多上下文,我們使用 MongoDB 來記錄數據,因此大多數集合都是寫入但很少讀取,除了少數小型集合(總共 100MB)會持續讀寫。數據儲存在單個 Mongo DB 數據庫中,其統計資訊如下所示(數據庫和集合名稱已修改):
"db" : "MyDatabase", "collections" : 854, "objects" : 243025868, "avgObjSize" : 541.2304596809423, "dataSize" : 131533002252, "storageSize" : 172592721920, "numExtents" : 7268, "indexes" : 1934, "indexSize" : 27824138048, "fileSize" : 210284576768, "nsSizeMB" : 16, "dataFileVersion" : { "major" : 4, "minor" : 5 }, "extentFreeList" : { "num" : 3, "totalSize" : 110592 }, "ok" : 1
工作集似乎在 100 MB 左右,如下圖所示:
"workingSet" : { "note" : "thisIsAnEstimate", "pagesInMemory" : 20874, "computationTimeMicros" : 26236, "overSeconds" : 876 },
最近失敗的輔助節點上的日誌文件輸出如下(這發生在啟動期間,儘管第一次失敗是在正常操作期間):
2014-11-25T09:25:17.833+0000
$$ rsBackgroundSync $$replSet 同步到:10.1.6.71:27017 2014-11-25T09:25:17.833+0000$$ rsBackgroundSync $$replset 將 syncSourceFeedback 設置為 10.1.6.71:27017 2014-11-25T09:25:17.849+0000$$ rsSync $$replSet 仍在同步,尚未到 minValid optime 54744561:c 2014-11-25T09:25:18.286+0000$$ rsSync $$ replSet SECONDARY 2014-11-25T09:26:01.590+0000$$ conn21 $$serverStatus 很慢:{ 在 basic: 0 之後,在 asserts 之後:0,在 backgroundFlushing 之後:0,在連接之後:0,在 cursors 之後:0,在 dur 之後:0,在 extra_info 之後:0,在 globalLock:0 之後,在 indexCounters 之後:0 ,鎖後:0,網路後:0,opcounters後:0,opcountersRepl:0後,oplog後:10451,recordStats後:10451,repl後:10451,結束:10451}2014-11-25T09:26:01.590 +0000$$ conn21 $$ 命令管理員。 $ cmd command: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] flushing mmaps took 15022ms for 115 files 2014-11-25T09:26:47.501+0000 [conn5] serverStatus was very slow: { after basic: 0, after asserts: 0, after backgroundFlushing: 0, after connections: 0, after cursors: 0, after dur: 0, after extra_info: 0, after globalLock: 0, after indexCounters: 0, after locks: 0, after network: 0, after opcounters: 0, after opcountersRepl: 0, after oplog: 4791, after recordStats: 4791, after repl: 4791, at end: 4791 } 2014-11-25T09:26:47.501+0000 [conn5] command admin. $ cmd 命令: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000$$ repl writer worker 6 $$ VirtualProtect for m:/mongodb/data/MyDatabase.72 chunk 21220 failed with errno:1455 分頁文件太小,無法完成此操作。(塊大小為 67108864,地址為 14b90000000)在 mongo::makeChunkWritable 中,終止 2014-11-25T09:27:06.350+0000$$ repl writer worker 6 $$ MyDatabase.RC_PUR_11_456754 致命斷言 16362 2014-11-25T09:27:06.615+0000$$ repl writer worker 6 $$堆棧跟踪失敗,SymInitialize 失敗並出現錯誤 3765269347 2014-11-25T09:27:06.615+0000$$ repl writer worker 6 $$ MyDatabase.RC_PUR_11_456754 2014-11-25T09:27:06.615+0000$$ repl writer worker 6 $$ ***在 fassert() 失敗後中止
在 Windows 下,在最壞的情況下,您的頁面文件大小可能必須設置為數據文件的大小 + 物理記憶體大小。因此,如果您的數據文件在磁碟上佔用 50GB,那麼在您的情況下,粗略的指導是將頁面文件大小設置為 53.5GB。這將在 MongoDB 2.8 版本中得到改善,因為新的儲存引擎不依賴於作業系統提供的虛擬記憶體服務。在相關主題上,您的 3.5GB 記憶體大小聽起來非常低。看看 Resource Monitor 下的 Hard Page Faults per second——如果這個數字是數百,你需要顯著增加你的記憶體大小