2013-06-12 63 views
3

我在MongoDB中调查了concurrency,显然它使用了数据库级锁定系统。我认为这意味着多个线程插入到同一个数据库中的表现会类似或比插入到数据库中的单个线程更差。为什么我的多线程插入程序比单个线程插入程序执行得更好?

我发现,当我得到4个线程并发插入数据库时​​,性能几乎翻倍(以插入/秒计)。

为什么性能越来越好,是否有任何理由?我不明白为什么。

如果有帮助,我有一个线程不断从服务器接收数据包并将其插入到队列中。我的4个线程持续从队列中出队并插入到数据库中。

+1

如果插入过程中的所有时间都通过写入RAM中的数据文件(当锁定被保持)时被占用,因为零件仅需要几微秒(微秒,而不是毫秒)。剩下的时间“其他”的东西正在发生 - 所以如果你有很多线程,你可能会得到最好的*性能,因为限制因素将是网络带宽或磁盘IO或CPU(一次你有足够的线程),而不是锁。 –

+0

谢谢!最终虽然(在足够的线程中)蒙哥应该成为限制因素,因为锁定,对吧? – n00b

+1

通常IO带宽(或RAM大小)在锁定之前将成为限制*。但是,如果你正在写很多小文件,有足够的RAM和快速磁盘,那么是的,锁可能成为瓶颈 –

回答

2

当在MongoDB中发生写入操作时,实际的写入锁只占完成所需总时间的一小部分。

事实证明写入RAM中的数据文件只需要几微秒(微,而不是毫秒)。剩下的时间“其他”东西正在发生 - 这就是为什么如果你有很多或者少数几个线程,你会得到最好的性能 - 在大多数情况下,限制因素将会是网络带宽或磁盘IO或CPU(一旦你有足够的线程),而不是锁。

如果你有足够的线程在mongod扔写入,文件非常小,盘面快速(用于冲洗所有数据写到磁盘),并有足够的内存来处理相关的索引更新,然后数据库锁定可以成为写入吞吐量的限制因素,但它通常不是成为瓶颈的第一或第二件事。

我鼓励您使用诸如mongostatiostat和其他系统监视资源的工具来查看实际瓶颈的位置。如果你没有看到,那么你的应用程序不会在数据库上投入足够的工作量以最大化其容量。