我有两台运行Windows Server 2012 R2的生产服务器。作为主服务器和辅助服务器,它们用于故障转移方案,其中如果一个失败,另一个将承担负载。
我的应用程序正在使用MongoDB复制。我有3个实例。主要和仲裁者(我将在不同的服务器上移动它,这只是一个临时灵魂)和辅助服务器上的辅助节点。
一段时间后,两台服务器的RAM消耗都变得非常高。 MongoDB占用了所有可用的RAM,但没有释放它。只有当MongoDB在副本中工作时,我才注意到这种行为。
我做了一些研究,发现不可能限制mongod进程本身的RAM使用。我对使用所有内存的MongoDB持怀疑态度。
请分享您的经验,想法或想法,如何在我的Windows服务器上限制mongodb进程的RAM使用率。
rs.status()"set": "XXXXXX",
"date": ISODate("2015-03-03T13:35:39.000Z"),
"myState": 1,
"members": [
{
"_id": 1,
"name": "Server1:3000",
"health": 1,
"state": 1,
"stateStr": "PRIMARY",
"uptime": 67557,
"optime": Timestamp(1425389739,
19),
"optimeDate": ISODate("2015-03-03T13:35:39.000Z"),
"electionTime": Timestamp(1425322202,
1),
"electionDate": ISODate("2015-03-02T18:50:02.000Z"),
"self": true
},
{
"_id": 2,
"name": "Abritrer1:3001",
"health": 1,
"state": 7,
"stateStr": "ARBITER",
"uptime": 67547,
"lastHeartbeat": ISODate("2015-03-03T13:35:38.000Z"),
"lastHeartbeatRecv": ISODate("2015-03-03T13:35:39.000Z"),
"pingMs": 0
},
{
"_id": 3,
"name": "Server2:3000",
"health": 1,
"state": 2,
"stateStr": "SECONDARY",
"uptime": 67542,
"optime": Timestamp(1425389737,
26),
"optimeDate": ISODate("2015-03-03T13:35:37.000Z"),
"lastHeartbeat": ISODate("2015-03-03T13:35:37.000Z"),
"lastHeartbeatRecv": ISODate("2015-03-03T13:35:38.000Z"),
"pingMs": 1,
"syncingTo": "Server1:3000"
}
],
"ok": 1
}
答案 0 :(得分:2)
出于这个原因,我们在生产环境中使用MongoDB。 强迫Mongo放弃记忆并不容易,将Mongo本身限制在一定的记忆限制同样很尴尬。
如果您使用的是Windows Server 2012,则可以安装Windows系统资源管理器,它应该允许您修复Mongo进程的最大工作集大小,尽管我自己没有尝试过。
您可能会发现以下博客文章对于将流程限制为特定大小非常有用。
除非您使用的是Windows Server计算机,否则我不确定您可以使用哪些其他工具进行更改,但限制操作系统分配的最大工作集的方法似乎是最好的方法。
祝你好运!编辑 - 考虑一下,如果集合中有大量数据,Mongo内存使用率将始终显示为高,但这并不总是意味着使用了内存。 与Java和C#如何为垃圾收集分配内存的方式类似,Mongo将最近使用的页面标记为可回收。 如果另一个进程请求内存,Mongo 应该释放一些较少使用的页面以提供空间。 当你看到Mongo占用超过3Gb的系统内存时会有些担心,但它似乎并不像看起来那么多。
作为测试,当Mongo使用率达到峰值时,您可以尝试启动内存饥饿的应用程序,并查看它是否释放了一些内存。 如果是这样,你可以简单地让Mongo按照它认为合适的方式处理内存使用情况(尽管在你的位置,我宁愿看到什么是空闲内存和什么不是。)
Mongo FAQ中关于内存映射文件的部分对此有所了解。 http://docs.mongodb.org/manual/faq/storage/