我查看了MongoDB中的concurrency,显然它使用了数据库级锁定系统。我认为这意味着插入同一数据库的多个线程的执行速度与插入数据库的单个线程相似或更差。
我发现当我将4个线程同时插入数据库时,性能几乎翻了一番(就插入/秒而言)。
有什么理由说明为什么性能会变得更好?我不明白为什么。
如果有帮助,我有一个线程不断从服务器接收数据包并将其插入队列。我的4个线程不断从该队列中出列并插入到数据库中。
答案 0 :(得分:2)
当在MongoDB中发生写操作时,实际的写锁定仅保留完成所需的总时间的一小部分。
事实证明,写入RAM中的数据文件只需要几微秒(微,而不是毫秒)。其余时间“其他”的东西正在进行 - 这就是为什么如果你有一个或多个线程,你将获得最佳性能 - 在大多数情况下,限制因素将是网络带宽或磁盘IO或CPU(一旦你有足够的线程)而不是锁。
如果有足够的线程在mongod
处抛出写入且文档非常小,则磁盘很快(用于将所有写入的数据刷新到磁盘)并且有足够的RAM用于处理相关的索引更新然后数据库lock 可以成为写入吞吐量的限制因素,但通常不会成为第一个或第二个成为瓶颈的因素。
我建议您使用mongostat
,iostat
等工具以及其他系统监控资源来查看实际瓶颈所在。如果您没有看到任何内容,那么您的应用程序不会足够快地在数据库上投入工作以最大化其容量。