我怎么知道MongoDB是否需要更多CPU / RAM?

时间:2014-06-14 06:50:34

标签: linux mongodb

我有一台运行在便宜的Linux VPS(1 x 2.0GHz CPU和1GB RAM)上的MongoDB服务器。

现在已经有一天了,db.stats()的输出看起来很合理。

db.stats()
{
        "db" : "app",
        "collections" : 11,
        "objects" : 2067,
        "avgObjSize" : 238.20416061925496,
        "dataSize" : 492368,
        "storageSize" : 1007616,
        "numExtents" : 18,
        "indexes" : 9,
        "indexSize" : 138992,
        "fileSize" : 16777216,
        "nsSizeMB" : 16,
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 5
        },
        "extentFreeList" : {
                "num" : 5,
                "totalSize" : 286720
        },
        "ok" : 1
}

我可以预测直到超出磁盘空间的天数。

我知道(来自FAQs)“MongoDB自动使用机器上的所有可用内存作为缓存。”

  1. 我应该如何确定是否需要更多RAM或CPU容量?

  2. 虽然它依赖于应用程序,但RAM或CPU通常更重要吗?

  3. 我应该特别注意db.runCommand( { serverStatus: 1, workingSet: 1 } )返回的内容吗?

1 个答案:

答案 0 :(得分:14)

  

我应该如何确定是否需要更多RAM或CPU容量?

拥有足够的内存非常重要,这样您的索引和数据就可以适合内存以获得良好的性能。如果你的workSet不适合你的内存,你会有很多page faults。当MongoDB需要未加载到物理内存中的数据并且必须从虚拟内存(即磁盘)读取数据时,会发生页面错误。 访问磁盘而不是内存会显着降低性能,因为访问磁盘比访问内存中的数据慢几个数量级。 SSD磁盘很好,但它们仍然比RAM慢得多。

人们经常忘记开放的连接也需要记忆。在Linux上,每个连接的内存开销大约为10 MB(在旧版本,如v1.8)。从v1.9开始,根据this JIRA ticket,这个开销变为大约1MB。因此,如果您有100个打开的连接,那将大致转换为1GB(在较旧版本上)和100MB(在较新版本上)的内存使用量(此数字可能已经更改为最新的MongoDB版本,因此YMMV)。您可以检查serverStatus命令输出中的connections,以查看有关当前/可用连接数的信息。

我建议您阅读MongoDB diagnostics

  

虽然它依赖于应用程序,但RAM或CPU通常更重要吗?

拥有更好的CPU对于CPU密集型任务非常重要,例如:扫描和排序,更新和重新平衡索引,map-reduce,聚合框架命令和服务器端JavaScript。拥有更好的CPU将有助于完成这些任务,但如果您没有足够的内存并且不断从磁盘读取,那么您的性能将会降低。

  

db.runCommand({serverStatus:1,workingSet:1})返回的是否应该特别注意?

命令serverStatus是收集服务器统计信息和分析服务器统计信息的非常有用的工具。

在输出serverStatus命令时,您应该注意:

  • mem包含有关当前内存使用情况的信息(虚拟和实用,即驻留)
  • workingSet部分包含有助于估算工作集大小的值,这是MongoDB主动使用的数据量。
  • extra_info - 尤其是page_faults计数器