我有一台运行在便宜的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自动使用机器上的所有可用内存作为缓存。”
我应该如何确定是否需要更多RAM或CPU容量?
虽然它依赖于应用程序,但RAM或CPU通常更重要吗?
我应该特别注意db.runCommand( { serverStatus: 1, workingSet: 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
命令时,您应该注意: