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

时间:2011-07-01 05:43:36

标签: mongodb ycsb nosql

我们最近使用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在更多负载下表现更好时,为什么不能以较少的负载执行相同的操作(比如说几个线程)利用多个核心?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:3)

Oracle不会锁定数据以保持一致性,但它会将数据写入重做并撤消文件以进行事务处理和读取一致性。 Oracle是一个MVCC系统。见http://en.wikipedia.org/wiki/Multiversion_concurrency_control

您必须使用参数化查询来使Oracle快速运行,否则Oracle将花费太多时间来解析查询。当许多小查询同时运行时,这一点尤其重要,即您正在测试的情况。

MongoDB会锁定写入。

编辑1:

Oracle和MongoDB之间的另一个重要区别是持久性。如果使用默认配置,MongoDB不提供持久性。它将每分钟数据写入磁盘一次。 Oracle会在每次提交时写入磁盘。所以Oracle做了很多事情。