MongoDB复制WIndows RAM问题

MongoDB复制WIndows RAM问题,mongodb,Mongodb,我有两台运行Windows server 2012 R2的生产服务器。作为主服务器和辅助服务器,它们用于故障转移场景,如果其中一个发生故障,另一个将承担负载 我的应用程序正在使用MongoDB复制。我有三个例子。主和仲裁器(我将把它移到另一台服务器上,这只是一个临时的souliton)以及辅助服务器上的辅助节点 一段时间后,两台服务器上的RAM消耗都变得非常高。MongoDB接受所有可用的RAM使用,并不释放它。只有当MongoDB在副本中工作时,我才注意到这种行为 我做了一些研究,发现不可能限

我有两台运行Windows server 2012 R2的生产服务器。作为主服务器和辅助服务器,它们用于故障转移场景,如果其中一个发生故障,另一个将承担负载

我的应用程序正在使用MongoDB复制。我有三个例子。主和仲裁器(我将把它移到另一台服务器上,这只是一个临时的souliton)以及辅助服务器上的辅助节点

一段时间后,两台服务器上的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进程的最大工作集大小,尽管我自己没有尝试过

您可能会发现下面的博文对于将进程限制为特定大小很有用

除非您使用的是Windows Server机器,否则我不确定您还可以使用哪些其他工具进行更改,但限制操作系统分配的最大工作集的方法似乎是最好的方法

祝你好运

编辑-作为一种想法,如果您的集合中有大量数据,Mongo内存使用率将始终很高,但是这并不总是意味着内存被使用。 与Java和C为垃圾收集分配内存的方式类似,Mongo将最近使用较少的页面标记为可回收页面。 如果另一个进程请求内存,Mongo应该释放一些使用较少的页面来提供空间。 当您看到Mongo占用了超过3Gb的系统内存时,您会有点担心,但问题并不总是像看上去的那样严重

作为测试,您可以尝试在Mongo使用达到峰值时启动内存不足的应用程序,看看它是否释放了一些内存。 如果是这样的话,您可能只需要让Mongo处理它认为合适的内存使用情况(尽管在您的位置上,我更希望看到什么是空闲内存,什么不是)

Mongo常见问题解答中有关内存映射文件的部分对此有一些说明。

谢谢你,亚历克斯。不幸的是,WIndows Server 2012 r2的资源管理器已被弃用:technet.microsoft.com/library/hh831568.aspx我担心如果我让mongoDB占用所有内存,服务器将变得不负责任(发生了两次)。我正在考虑将副本集移动到linux(Ubuntu)机器上,因为mongoDB更“原生”对于Linux,迁移到Ubuntu系统当然是一种选择。我发现,当我们向Windows上的Mongo写入数据时,它偶尔会变得无响应。话虽如此,我们还是定期将其置于高负荷下,这证明是不可能维持的。当然,在Linux上进行内存分配的实验是值得的,尽管我可能会建议使用Debian作为操作系统,因为它比Ubuntu轻一些,而且通常更稳定(如果不是最新的话)。测试应该提供可靠的结果。但是,我说的是一个无法承受任何停机时间的生产环境。如前所述,对我们的Zabbix警报(内存消耗超过20%)的延迟反应,服务器变得不负责任,导致客户不满和停机。啊,好吧,在一个非常严重的生产环境中。抱歉,我错过了服务器之前两次没有响应的消息。由于资源管理器已被弃用,我不确定您可以使用什么来实现相同的结果。这里有一个工具——它可以做同样的工作,但它是一个开源工具,我从未尝试过。这可能是一种解决问题的方法,但我会小心地在生产系统中使用它。不过,这可能值得一看。这可能是一个真正的工具。我也不确定ProcessGovenor是否能与非.NET应用程序一起工作,但它似乎是在Windows process对象上运行的,而不是在.NET特定的对象上运行的,因此它可能会完成这项工作。你有没有研究内存的去向?您可以发布
db.serverStatus()
mem
子文档吗?此外,日志中是否有与性能相关的内容?记录的查询速度慢或刷新时间长?您好@wdberkeley。以下是db.serverStatus()的mem部分“mem”:{“bits”:64,“resident”:956,“virtual”:91003,“supported”:true,“mapped”:45402,“mappedWithJournal”:90804不,我在日志中找不到任何关于性能或记录的慢速查询和刷新时间的信息。。