MongoDB提供了不一致的写入时间

时间:2014-08-18 21:39:09

标签: mongodb reactivemongo

我在Ubuntu上运行Scala,Reactive Mongo 0.10.5和Mongo 2.6.4。我已经测试了一些机器配置,但现在我正在使用15GB的内存,2个内核和60GB的SSD存储(AWS)

我刚刚设置了一个测试mongo实例并且已经使用它来对一些事情进行基准测试,但是我看到了一些我无法解释的不一致。

我正在使用10个单独的线程向单个集合编写一致数量的数据。每个写入包含一个包含数组的文档,该数组包含1000个元素。每个元素都是一个由多个字段和嵌套字段组成的复杂文档。我已经测试了1000,10000和100的数组,并且已经看到了所有的相同行为。每次写入都是唯一的(即我从不写入同一文档两次)

使用我当前使用的硬件,写入速度往往在每次写入100-200ms左右。我想要更好,但这不是我的主要问题。

我的主要问题是有时写入时间会激增。当他们这样做时,可能需要几秒钟才能完成。他们最终完成但需要一段时间。我在应用程序中内置超时写入(10秒),当尖峰发生时,它会经常达到超时。我已经增加了超时并验证了写操作最终完成但可能需要很长时间(30秒以上)。

在Scala中使用Mongo Java Driver之前我曾与Mongo合作过,并没有注意到这个问题。但是,目前还不清楚问题是由驱动程序还是我的Mongo设置引起的。

我查看了日志,当他们报告查询时间较长时,他们实际上并没有提供有关为什么需要更长时间的信息。我已经对分析做了同样的事情,他们又报告了一个长查询,但没有说明为什么它很长。

我在运行时运行了mongostat,似乎当写入开始需要很长时间时,我注意到mongostat中的类似减速。 I.E.在继续之前,mongostat会暂停几秒钟。

当这种情况发生时,mongo机器本身很无聊。 CPU和内存使用量的平均负载最小。它似乎没有进入交换。

我怀疑我只是在Mongo中配置错误,但我找不到任何能说明什么的东西。

之前有没有人见过这种行为?它是我的配置中的东西,还是Reactive Mongo驱动程序的东西?

更新:

使用iostat我能够确定正常的写入/秒大约是1Mb /秒。然而,在缓慢的时期,它会达到6-7Mb /秒。

我还在mongo日志中找到了以下内容。

  

[DataFileSync]刷新mmaps为35个文件花了15621ms

     

[DataFileSync]刷新mmaps为22个文件花了14816ms

在至少一种情况下,这个日志语句完全对应于其中一个减速。

这肯定是基于这些观察结果的磁盘冲洗问题。

这是否意味着我推送的数据超过了当前Mongo配置可以处理的数据?或者是否有其他配置可以减少那些冲洗的影响?

1 个答案:

答案 0 :(得分:0)

在这种情况下,问题实际上可能与应用程序本身内的线程锁定有关。一旦我解决了线程锁定的问题,这些其他问题似乎就消失了。

老实说,我不知道为什么线程锁定会导致Mongo中观察到的行为,但如果问题消失了,我不会抱怨。