我使用了命令
db.collection.stats()
db.stats()
{
"collections" : 17,
"objects" : 487747,
"avgObjSize" : 1924.9327048654322,
"dataSize" : 938880152,
"storageSize" : 1159314432,
"numExtents" : 82,
"indexes" : 32,
"indexSize" : 153812992,
"fileSize" : 8519680000,
"ok" : 1
}
从网上我发现了这个陈述
索引应该始终在内存中。(这只是RAM)
索引大小为153812992
,数据大小为938880152
您能否告诉我MongoDB服务器需要多少RAM,以便性能良好。
根据应用程序设计,可能会发生近100k次插入/更新,而我还有一个问题是,这个索引大小每天都会增长吗?
那么在这种情况下,我如何确定我的应用程序的最佳RAM大小。
请提前建议,谢谢。
答案 0 :(得分:5)
MongoDB的更高版本中有一个工具可帮助您找出工作集的大小,它仍然具有实验性,但应该可以正常工作:http://docs.mongodb.org/manual/reference/command/serverStatus/#serverStatus.workingSet
使用它的最佳方法是创建一个自动化测试脚本,该脚本将使用您的应用程序,同时打印出serverStatus
并存档工作集文档的值。你可以绘制图形等等,并得出你的RAM需要的合理结论。
答案 1 :(得分:5)
有关MongoDB的事情多年来发生了变化。 今天MongoDB说:
在版本3.0中更改:
serverStatus
不再输出workingSet
TL; DR
如果在MongoDB上使用MMAPv1存储引擎,则working set
存在。
https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram
如果在MongoDB上使用WiredTiger存储引擎,无需考虑working set
。
https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine
WiredTiger存储引擎的内存诊断
我的工作集大小是否适合RAM?
没有
如何计算应用程序需要多少RAM?
使用WiredTiger,MongoDB同时使用WiredTiger内部缓存 和文件系统缓存。
在版本3.2中更改:从MongoDB 3.2开始,即WiredTiger 默认情况下,内部缓存将使用较大的一个:
60%的RAM减去1 GB或1 GB。
的更新强>
从3.4开始,默认情况下,WiredTiger内部缓存将使用 两者中较大者:
50%(RAM - 1 GB)或256 MB。例如,在具有总计的系统上 4GB内存的WiredTiger缓存将使用1.5GB的RAM(0.5 *(4 GB - 1 GB)= 1.5 GB)。相反,一个总共1.25 GB RAM的系统将为WiredTiger缓存分配256 MB,因为这超过了 总RAM的一半减去1千兆字节(0.5 *(1.25 GB - 1 GB)= 128 MB< 256 MB)。
答案 2 :(得分:2)
您的工作集应留在内存中以获得良好的性能。否则会发生许多随机磁盘IO。
MongoDB数据库的工作集是客户端最常访问的数据部分。您可以使用
估算工作集的大小db.runCommand({serverStatus:1,workingSet:1})
在SO级别。查看页面错误的数量或速率以及其他MMS量表,以便在需要更多RAM时进行检测。
如果页面错误很少发生,则您的工作集适合RAM。如果故障率高于此值,则可能会降低性能。
在管理工作集大小时要特别注意的一个方面是索引访问模式。如果要在随机位置插入索引(就像哈希随机生成的id一样),您将不断更新整个索引。如果您能够以近似升序创建您的ID(例如,与随机ID连接的日),则所有更新将发生在b树的右侧,并且索引页的工作集大小将会很多小。
来源:MongoDb FAQ