我有两台运行Windows服务器2012 R2的生产服务器。作为主服务器和辅助服务器,它们用于故障切换场景,如果其中一个发生故障,另一个将承担负载。
我的应用程序正在使用MongoDB复制。我有3个例子。主节点和仲裁器(我将把它移到另一台服务器上,这只是一个临时的灵魂)以及辅助服务器上的辅助节点。
一段时间后,两台服务器上的RAM消耗都变得非常高。MongoDB占用了所有可用的RAM使用,并没有发布它。我注意到只有当MongoDB在副本中工作时才会出现这种行为。
我做了一些研究,发现不可能限制mongod进程本身的RAM使用。我对MongoDB使用所有RAM有点怀疑。
请分享你的经验、想法或想法,如何限制我的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
}
出于这个原因,我们不再在生产环境中使用MongoDB。强迫Mongo放弃内存并不容易,将Mongo本身限制在一定的内存限制内也同样尴尬。
如果你使用的是Windows Server 2012,你可以安装Windows系统资源管理器,它应该允许你修复Mongo进程的最大工作集大小,尽管我自己还没有尝试过。
您可能会发现以下关于将进程限制为特定大小的博客文章非常有用。
http://blogs.technet.com/b/clinth/archive/2012/10/11/can-a-process-be-limited-on-how-much-physical-memory-it-uses.aspx
除非你在Windows Server机器上,否则我不确定你可以使用什么其他工具来进行更改,但限制操作系统分配的最大工作集似乎是最好的方法。
祝你好运!
编辑-作为一种想法,如果你的集合中有很多数据,Mongo的内存使用率总是会很高,但这并不总是意味着内存被使用了。与Java和C#为垃圾回收分配内存的方式类似,Mongo将最近使用较少的页面标记为可回收页面。如果另一个进程请求内存,Mongo应该释放一些不太常用的页面来提供空间。当你看到Mongo占用了超过3Gb的系统内存时,你会有点担心,但这并不总是看起来那么大的问题。
作为测试,您可以尝试在Mongo使用率达到峰值时启动一个内存不足的应用程序,看看它是否释放了一些内存。如果是这样的话,您可以简单地让Mongo根据自己的意愿处理内存使用情况(尽管在您的位置上,我更愿意确切地了解什么是空闲内存,什么不是)。
Mongo常见问题解答中关于内存映射文件的部分对此进行了介绍。http://docs.mongodb.org/manual/faq/storage/