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

标签 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 } ) 有什么我应该特别注意的吗?

最佳答案

How should I determine whether I need more RAM or CPU capacity?

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

人们常常忘记开放的连接也需要内存。在 Linux 上,每个连接的内存开销约为 10 MB(在 v1.8 等旧版本上)。自 v1.9 起,根据 this JIRA ticket,此开销已更改为大约 1MB。 .因此,如果您有 100 个打开的连接,这将粗略地转化为 1GB(旧版本)和 100MB(新版本)的内存使用量(这个数字可能随着最新的 MongoDB 版本而改变,所以 YMMV)。您可以查看 connectionsserverStatus 命令的输出中查看有关当前/可用连接数的信息。

我建议您阅读 MongoDB diagnostics .

Although it's application dependent, is either RAM or CPU generally more important?

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

Is there anything returned by db.runCommand( { serverStatus: 1, workingSet: 1 } ) that I should pay particular attention to?

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

serverStatus命令的输出中需要注意:

  • mem包含有关当前内存使用情况的信息(虚拟和物理,即常驻)
  • workingSet部分包含可用于估计工作集大小的值,工作集大小是 MongoDB 主动使用的数据量。
  • extra_info - 特别是 page_faults 计数器

关于linux - 我怎么知道 MongoDB 是否需要更多 CPU/RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24217405/

相关文章:

mongodb - 在 MongoDB 聚合映射中将 ObjectId 转换为 String,反之亦然

c - 使用 sigaction 发送有效负载

mysql - 如何编写连接 MySQL 服务器并执行 SQL 查询的 c 程序?

MongoDB:通过匹配该项目的另一个字段来更新数组中项目的字段

在两个文档上写入时 Mongodb 在副本集上的最终一致性

node.js - 一个 Mongoose 集合会减慢另一个集合的速度吗?

java - Spring数据Mongodb检索数据: @Document VO returns null

regex - 替换变量中的随机字符

c++ - 如何使用mmap和shm_open在多个独立进程之间共享内存

linux - 每 2 秒检查一次目录内容,如果 bash 中存在某个文件,则复制其内容