Mongo连接池和最大连接

时间:2014-03-24 17:58:47

标签: mongodb mongodb-java

我的应用程序使用2.11.2版本的java驱动程序运行mongodb 2.4.8。当数据库中有太多对象时,它总是以mongo在我的RHEL上占用太多缓存。我的总8GB中几乎有4GB主要是缓存的。即使我尝试使用“ sync; echo 3> / proc / sys / vm / drop_caches ”强行清除缓存(作为管理员),它也不会清除缓存,但一旦我停止mongo i可以使用此命令清除缓存。我使用 db.serverStatus()。connections (我有近6个其他app服务器正在编写或从mongo服务器读取数据)看到我的mongo服务器有近600多个连接。

  1. 此连接号是否导致重缓存?
  2. 即使不是,我应该与我的数据库建立这么多连接吗?
  3. 目前在我的代码中,connectionsPerHost设置为100。这太高了吗?
  4. 我可以将connectionsPerHost保持为10并将threadsAllowedToBlockForConnectionMultiplier保持为500吗?这是推荐的吗?
  5. 提前致谢

1 个答案:

答案 0 :(得分:3)

在mongod实例上600个连接并不合理。在MongoDB 2.4中,限制为20K。虽然每个连接的内存使用成本都应该很小。关于MongoDB连接的更多信息,我建议以下博客文章:http://blog.mongolab.com/2013/11/deep-dive-into-connection-pooling/

重要的是要注意MongoDB将根据需要使用可用的内存。在大多数情况下,这个内存将是进程驻留内存。如果您看到mongod数据文件的大型文件系统缓存,则可能是您的预读设置太高。 Readahead是一种机制,磁盘访问将引入额外的顺序数据块 - 改进顺序I / O.对于执行随机i / o的过程而言,这不一定是有益的,这通常是数据库系统的情况。检查请运行:

  • sudo blockdev --report

建议将readahead 32作为MongoDB数据文件系统的良好起点。默认值通常要高得多 - 针对顺序I / O而不是随机。

重要的是要注意文件系统缓存的使用 - 即使是高 - 一般不应该是一个问题。 Linux使用未使用的内存来填充此缓存,如果活动进程需要,则应该释放。

关于你的问题#3& #4 - 除非需要,否则我不会调整默认设置。更改不会减少文件系统缓存。