7

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

我们在 LAN 上的 2 CPU Xeon 四核(共 8 核)+ 8 GB RAM 上运行了这个基准测试。

我们观察到的是,与单线程客户端相比,MongoDB 在多线程客户端上的性能更好,我的问题是:当 MongoDB 可以在更多负载下表现更好时,为什么它不能在更少负载下做同样的事情(比如只有几个线程) 通过利用多个核心?

4

2 回答 2

8

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

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

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

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

于 2011-07-01T06:06:33.597 回答
3

Oracle 不会锁定数据以实现一致性,但它会将数据写入重做和撤消文件以实现事务和读取一致性。Oracle 是一个 MVCC 系统。请参阅http://en.wikipedia.org/wiki/Multiversion_concurrency_control

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

MongoDB 确实会锁定写入。

编辑1:

Oracle 和 MongoDB 之间的另一大区别是持久性。如果您使用默认配置,MongoDB 不提供持久性。它每分钟向磁盘写入一次数据。Oracle 每次提交都会写入磁盘。所以 Oracle 做了更多的 fsyncing。

于 2011-07-01T10:58:32.063 回答