现在已经有一天了,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})返回的是否应该特别注意?
解决方法
How should I determine whether I need more RAM or cpu capacity?
拥有足够的内存非常重要,这样您的索引和数据就可以适应内存以获得良好的性能.如果你的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.
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计数器