与单线程客户端相比,为什么MongoDB在多线程客户端上表现更好?

vik*_*ing 6 mongodb nosql ycsb

我们最近使用YCSB(https://github.com/brianfrankcooper/YCSB/wiki)对Oracle 10g和MongoDB进行了基准测试,当我们尝试增加1,000,000个数据集的线程数时,Oracle的性能在4个线程之后保持不变,但MongoDB继续执行更好,更好,直到8个线程,之后只有读取更好,写入和更新(操作/秒)保持不变.

我们在2个CPU Xeon四核(总共8个核心)+ 8 GB RAM上运行此基准测试.

我们观察到,与单线程客户端相比,MongoDB在多线程客户端上的表现更好,我的问题是:当MongoDB在更多负载下表现更好时,为什么不能以较少的负载执行相同操作(比如只需几个线程) )通过利用多核?

bti*_*lly 6

在单个核心上处理请求在逻辑上非常简单.只需拥有接收请求的代码,然后处理它.

在2个内核上处理单个请求并不是那么简单,因为这样做需要您将请求分解为组件,分配工作,同步答案,然后构建单个响应.如果你做这项工作,虽然你可以减少挂钟时间(墙上的时钟通过多少时间),你总是会使请求占用更多的CPU时间(消耗的总CPU资源).

在像MongoDB这样的系统中,您希望有很多不同的客户端发出请求,因此无需尝试并行处理单个请求,并且不需要.

更大的问题是为什么Oracle在4个CPU之后没有增加并发性.有许多可能的原因,但一个合理的猜测是您遇到了某种锁定,这是保证一致性所必需的.(MongoDB不能为您提供一致性,因此可以避免这种类型的瓶颈.)

  • @TTT:如果您认为Oracle没有锁定,那你就错了.Oracle已经竭尽全力拥有许多细粒度的短期锁,以最大限度地提高并发性.但是在引擎盖下它绝对使用锁定来保证一致性,而且我个人看到Oracle数据库在加载过程中因为模糊的锁定问题而多次没有警告.(当你解决一个锁定问题时,你会遇到另一个问题.) (2认同)