我想知道是否有人可以帮助解决我们似乎遇到的 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 1-2014 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,在游标之后: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] 命令 admin.$cmd 命令:serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] 刷新 mmaps 花费 15022ms 处理 115 个文件 2014- 11-25T09:26:47.501+0000 [conn5] serverStatus 非常慢:{ 在 basic 之后:0,在断言之后:0,在 backgroundFlushing 之后:0,在连接之后:0,在游标之后:0,在 dur:0 之后,在 extra_info 之后:0,在 globalLock 之后:0,在 indexCounters 之后:0,在锁之后:0,在网络之后:0,在 opcounters 之后:0,在 opcountersRepl 之后:0,在 oplog 之后:4791,在 recordStats 之后:4791,在 repl 之后:4791,在结束: 4791 } 2014-11-25T09:26:47.501+0000 [conn5] 命令 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]1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] 刷新 mmaps 为 115 个文件花费了 15022ms 2014-11-25T09: 26:47.501+0000 [conn5] serverStatus 非常慢:{ 在 basic 之后:0,在断言之后:0,在 backgroundFlushing 之后:0,在连接之后:0,在游标之后:0,在 dur:0 之后,在 extra_info 之后:0,之后globalLock:0,indexCounters 之后:0,锁之后:0,网络之后:0,opcounters 之后:0,opcountersRepl 之后:0,oplog 之后:4791,recordStats 之后:4791,repl 之后:4791,结束时:4791 } 2014 -11-25T09:26:47.501+0000 [conn5] 命令 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]1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] 刷新 mmaps 为 115 个文件花费了 15022ms 2014-11-25T09: 26:47.501+0000 [conn5] serverStatus 非常慢:{ 在 basic 之后:0,在断言之后:0,在 backgroundFlushing 之后:0,在连接之后:0,在游标之后:0,在 dur:0 之后,在 extra_info 之后:0,之后globalLock:0,indexCounters 之后:0,锁之后:0,网络之后:0,opcounters 之后:0,opcountersRepl 之后:0,oplog 之后:4791,recordStats 之后:4791,repl 之后:4791,结束时:4791 } 2014 -11-25T09:26:47.501+0000 [conn5] 命令 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]0 锁(微) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] 刷新 mmaps 为 115 个文件花费了 15022ms 2014-11-25T09:26:47.501+0000 [conn5] serverStatus 非常slow: { 在 basic: 0 之后,在 asserts: 0 之后,在 backgroundFlushing: 0 之后,在连接之后:0,在游标之后:0,在 dur: 0 之后,在 extra_info: 0 之后,在 globalLock: 0 之后,在 indexCounters: 0 之后,在锁之后:0,在网络之后:0,在opcounters之后:0,在opcountersRepl之后:0,在oplog之后:4791,在recordStats之后:4791,在repl之后:4791,在结束:4791}2014-11-25T09:26:47.501 + 0000 [ conn5] 命令 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工人 6]0 锁(微) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] 刷新 mmaps 为 115 个文件花费了 15022ms 2014-11-25T09:26:47.501+0000 [conn5] serverStatus 非常slow: { 在 basic: 0 之后,在 asserts: 0 之后,在 backgroundFlushing: 0 之后,在连接之后:0,在游标之后:0,在 dur: 0 之后,在 extra_info: 0 之后,在 globalLock: 0 之后,在 indexCounters: 0 之后,在锁之后:0,在网络之后:0,在opcounters之后:0,在opcountersRepl之后:0,在oplog之后:4791,在recordStats之后:4791,在repl之后:4791,在结束:4791}2014-11-25T09:26:47.501 + 0000 [ conn5] 命令 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工人 6]155+0000 [DataFileSync] 刷新 mmaps 为 115 个文件花费了 15022ms 2014-11-25T09:26:47.501+0000 [conn5] serverStatus 非常慢:{ 在 basic 之后:0,在断言之后:0,在 backgroundFlushing 之后:0,在连接之后: 0,游标之后:0,dur:0之后,extra_info之后:0,globalLock之后:0,indexCounters之后:0,锁之后:0,网络之后:0,opcounters之后:0,opcountersRepl之后:0,oplog之后:4791,recordStats 之后:4791,repl 之后:4791,结束:4791 } 2014-11-25T09:26:47.501+0000 [conn5] 命令 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]155+0000 [DataFileSync] 刷新 mmaps 为 115 个文件花费了 15022ms 2014-11-25T09:26:47.501+0000 [conn5] serverStatus 非常慢:{ 在 basic 之后:0,在断言之后:0,在 backgroundFlushing 之后:0,在连接之后: 0,游标之后:0,dur:0之后,extra_info之后:0,globalLock之后:0,indexCounters之后:0,锁之后:0,网络之后:0,opcounters之后:0,opcountersRepl之后:0,oplog之后:4791,recordStats 之后:4791,repl 之后:4791,结束:4791 } 2014-11-25T09:26:47.501+0000 [conn5] 命令 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]在断言之后:0,在 backgroundFlushing:0 之后,在连接之后:0,在游标之后:0,在 dur:0 之后,在 extra_info:0 之后,在 globalLock:0 之后,在 indexCounters:0 之后,在锁之后:0,在网络之后:0, opcounters 之后:0,opcountersRepl 之后:0,oplog 之后:4791,recordStats 之后:4791,repl 之后:4791,最后:4791} 2014-11-25T09:26:47.501+0000 [conn5] 命令 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]在断言之后:0,在 backgroundFlushing:0 之后,在连接之后:0,在游标之后:0,在 dur:0 之后,在 extra_info:0 之后,在 globalLock:0 之后,在 indexCounters:0 之后,在锁之后:0,在网络之后:0, opcounters 之后:0,opcountersRepl 之后:0,oplog 之后:4791,recordStats 之后:4791,repl 之后:4791,最后:4791} 2014-11-25T09:26:47.501+0000 [conn5] 命令 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]回复后:4791,结束时:4791 } 2014-11-25T09:26:47.501+0000 [conn5] 命令 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]回复后:4791,结束时:4791 } 2014-11-25T09:26:47.501+0000 [conn5] 命令 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 Fatal Assertion 16362 2014-11-25:25:T69 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工人 6]
***在 fassert() 失败后中止
在 Windows 下,在最坏的情况下,您的页面文件大小可能必须设置为数据文件大小 + 物理内存大小。因此,如果您的数据文件在磁盘上占用 50GB,那么在您的情况下,粗略的指导是将页面文件大小设置为 53.5GB。这将随着 MongoDB 2.8 版本的发布而得到改善,因为新的存储引擎不依赖操作系统提供的虚拟内存服务。在相关主题上,您的 3.5GB 内存大小听起来很低。查看资源监视器下的每秒硬页面错误数——如果数字为数百,则需要显着增加内存大小