为什么我的多线程插入比单线程插入表现更好?

4

我查看了MongoDB的并发性,发现它使用了数据库级别的锁系统。我认为这意味着多个线程插入到同一个数据库时,性能会与单个线程相似或更差。

但是当我有4个线程同时插入到数据库时,性能几乎增倍了(以每秒插入数计算)。

为什么性能会变得更好?我不理解原因。

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


1
如果在插入期间的所有时间都用于写入RAM中的数据文件(当锁定时),那么实际上该部分只需要微秒级别的时间(微秒而不是毫秒)。其余时间会发生“其他”事情 - 因此,如果您有大量线程,则可能会获得最佳性能,因为限制因素将是诸如网络带宽或磁盘IO或CPU(一旦您拥有足够的线程)而不是锁定。 - Asya Kamsky
谢谢!最终,当足够多的线程时,Mongo应该会因为锁而成为限制因素,对吧? - claudio
1
通常,在锁之前,IO带宽(或RAM大小)将成为限制因素。但是,如果您正在编写许多小文档,并具有充足的RAM和快速磁盘,则锁定可能会成为瓶颈。 - Asya Kamsky
1个回答

3
在 MongoDB 中进行写入时,实际的写入锁只会占用很小一部分完成时间。事实上,在 RAM 中写入数据文件只需要微秒级别的时间(注意是微秒,不是毫秒)。其余时间都在进行“其他”工作 - 这就是为什么如果有大量线程的话,性能将最佳。在大多数情况下,限制因素将是网络带宽、磁盘 IO 或 CPU(一旦您拥有足够的线程),而不是锁定。如果您有足够的线程不断向 mongod 抛出写入请求,并且文档非常小,磁盘速度很快(以便将所有已写入的数据刷新到磁盘),并且有足够的 RAM 来处理相关的索引更新,则数据库锁可以成为您的写入吞吐量的限制因素,但这通常不是首要或第二个成为瓶颈的原因。我鼓励您使用像 mongostat、iostat 和其他系统监视资源等工具来查看实际瓶颈所在。如果您没有看到任何瓶颈,则表示您的应用程序没有快速地将工作抛给数据库,以使其达到最大容量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接