2014-01-08 34 views
0

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

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

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

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

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

我观察这些就地升级(多查询)表现不佳。 这是由于写入锁定引起的问题吗? 每个线程(10000)都会更新与查询相关的文档? - 所以似乎有很多“等待” 有没有更有效的方法来做这些“推”操作? “UpdateMulti”是否是正确的方法?

钍ANK你很大的反响 - 编辑和添加一些更多的信息

一些设计背景:

您是我们的问题的理解是正确的。我们有10000个线程,每个线程代表一个“演员”,每次更新多达1000个实体(基于适当的查询),每次推送一次。

反转模型导致我们导致一些破碎的用例(从我们的领域的角度来看)导致我们加入主要实体的“状态”(现在将分散在许多集合中) - 例如:这些操作中的每一个都是该实体的状态变化 - E具有状态(e1,e2,e3,e4,e5) - 因此e1至e5表示为由10,000个线程/进程更新的聚合数组,这些线程/进程表示外部应用程序的动作。

我们需要接近实时聚合,因为另一组“演员”查看e1到e5的这些“状态”,然后通过另一个通道适当地响应“阵列中的元素”。

在这种情况下,什么应该是“理想”的设计策略 - 加快写入速度。 将分片的帮助 - 是否有一个“量级”的启发式 - 在什么锁定%我们应该碎片等。

+0

需要一些澄清 - 事先已知的状态?换句话说,有多少个州--5?如果是这样,为什么他们必须是一个数组?你可以给出一个文件“进行中”的例子以及另一组演员正在使用的查询类型吗? –

+0

C {a1 =“”,// //属性a2 =“”,a3 =“”C_s1 = [a1,a2,a3,a4,...] //实体C的状态s1 C_s2 = [a5, a3,a4,...] C_s3 = [a1,a2,a3,a4,...] C_s4 = [a1,a2,a3,a4,...] C_s5 = [a1,a2,a3 ,a4,....]}这5个状态已经被编码为数组类型 - 因此,对于一个给定的ai实例,执行多更新的任何查询都将从“ai”的角度来看 - 它可能需要更新多个C在不同的状态下适用 - 即C1中的s1,C3中的s2等......每隔几分钟。另一位演员只看着他们各自的状态,并与他们交往,引导他们通过国家机器@Asya Kamsky –

回答

1

这是一个问题,因为你的模式设计。

$push对多个文档(尤其是来自多个线程)的多个值的效率极低。写锁不是问题,而是你的设计成为问题。此外,您持续增长的文档意味着更新不“到位”,您的收藏快速分散。

看起来你的模式是“颠倒”。您有10,000个主题希望将数字代表人物(我假设人数非常多)添加到少量文档(1000),这些文档将变得非常庞大。在我看来,如果你想将某些东西嵌入其他东西中,你可能会考虑代表人物的集合,然后嵌入这些人被发现的事件 - 至少你将每个人的数组大小限制在1000人以内,更新将分布在大量文档中,显着减少争用。

另一种方法是简单地记录出席的事件/人员,然后再对原始数据进行汇总,但不知道您对此应用程序的要求是什么,很难知道哪种方式会产生最佳结果 - 你选择的方式绝对不可能给你带来好的表现。

+0

您好,您的回应很好 - 编辑并在问题中增加了一些信息 –

+0

C { a1 = “”,/ /// attributes a2 =“”, a3 =“” C_s1 = [a1,a2,a3,a4,....] //实体C的状态s1 C_s2 = [a5, a4,a11,a1,...] C_s3 = [a1,a2,a3,a4,...] C_s4 = [a1,a2,a3,a4,...] C_s5 = [a1, a2,a3,a4,...] } 这5个州已经是e编码为数组类型 - 因此,对于给定的ai实例,任何进行多更新的查询都将从“ai” 的角度来看 - 它可能需要在不同状态下适当地更新多个C - 即s1 in C1,S2等C3 ...每隔几分钟。 另一位演员只看到ai在他们各个州的状态,并与他们交往,引导他们穿过状态机 –