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

oko*_*oko 9 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
}
Run Code Online (Sandbox Code Playgroud)

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

我知道(来自常见问题解答)"MongoDB自动使用机器上的所有可用内存作为缓存."

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

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

  3. 有什么东西归还db.runCommand( { serverStatus: 1, workingSet: 1 } )我应该特别注意吗?

Chr*_*n P 16

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

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

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

我建议您阅读MongoDB诊断程序.

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

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

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

命令serverStatus是一个非常有用的工具,用于收集有关服务器的统计信息并分析服务器统计信息.

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

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