繁体   English   中英

Mongodb性能问题

[英]Mongodb Performance issue

我正在使用mongodb,我需要更新我的文档,说总共有1000个。 我的文档具有如下基本结构:

{
People:[1,2,3,4],
Place:"Auckland"
Event:"Music Show"
}

我有10,000个线程在另一个VM中同时运行。 每个线程都会查找这些文档(1000),查看这1000个文档是否与查询匹配,并在People数组中推送一个数字。 假设如果找到的线程100说这1000个相关文档中有500个,那么它将在所有500个文档的People数组中推送数字100。 为了这,

我正在为每个线程(10000)使用命令

update.append("$push",new BasicDBObject("People",serial_number));
updateMulti(query,update);

我发现这些就地更新(多查询)的性能很差。 这是归因于写锁定的问题吗? 每个线程(10000)更新与查询相关的文档吗? -因此似乎有很多“等待”吗?有没有更有效的方法来执行这些“推送”操作? “ UpdateMulti”是解决此问题的正确方法吗?

谢谢您的回应-编辑和添加更多信息

一些设计背景:

是的,您对我们问题的理解是正确的。 我们有10000个线程,每个线程代表一个“角色”,使用$ push一次最多更新1000个实体(基于适当的查询)。

反转模型会导致我们遇到一些破碎的用例(从我们的领域角度来看),从而导致我们跨主要实体的“状态”(现在将分布在多个集合中)联接-例如:这些动作中的每个动作都是针对该实体-E具有状态(e1,e2,e3,e4,e5)-因此e1到e5表示为一个汇总数组,该数组通过10,000个代表外部应用程序动作的线程/进程进行更新。

我们需要接近实时的聚合,因为另一组“参与者”会查看e1到e5的这些“状态”,然后通过另一个通道对“数组中的元素”进行适当的响应。

在这种情况下,什么是“理想”的设计策略-加快写入速度。 会分片帮助-是否对此进行“量级”试探-我们应该分片锁定的百分比等。

由于您的架构设计,这是一个问题。

$push多个值(特别是来自多个线程)的$push送到多个文档的效率极低。 问题不仅仅在于写锁定,还在于您的设计使它成为了问题。 此外,您还在不断增加文档,这意味着更新“不到位”,并且您的收藏很快就变得支离破碎。

看来您的架构是“颠倒的”。 您有10,000个线程,希望将代表人员的数字(我假设有很多人)添加到少量文档(1000个)中,该文档将变得庞大。 在我看来,如果您想将某些内容嵌入其他内容,则可以考虑代表人的集合,然后嵌入发现这些人的事件-至少您将每个人的数组大小限制为最多1000个,更新将散布在大量文档中,从而大大减少了争用。

另一个选择是简单地记录参加会议的事件/人员,然后在以后对原始数据进行汇总,但是在不确切知道您对该应用程序有什么要求的情况下,很难知道哪种方法会产生最佳结果-您拥有的方式选择绝对是不可能给您带来好的表现的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM