我正在使用 YCSB 基准测试工具对 Couchdb 和 Mongodb 的性能进行基准测试。不幸的是,我似乎做错了,因为单个随机操作的性能差异很大:
工作负载 A(50/50 读取/更新),16 个查询线程,120 秒运行时间(结果与 20 分钟运行时间非常相似):
CouchDB 1.6.1:整体吞吐量:1076 ops/sec,99th percentile 读取延迟 13ms,99th percentile 更新延迟 13ms
MongoDB 3.0.6:总吞吐量:11203 ops/sec,99th percentile 读取延迟 1ms,99th percentile 更新延迟 1ms
如您所见,CouchDB 对于随机读取和更新非常慢。文档建议使用可能对插入很好的批量操作,但考虑到 YCSB 正在逐一请求读取,我看不出我将如何实现批量读取。
测试环境:
- Ubuntu 14.04 64bit 在 i7 主机上的虚拟机上启用了 VT-D,2 核,2gb ram(尽管我在专用机器上得到了类似的结果)
- 工作集/db 很容易放入 ram
- 本地主机服务器,无硬件网络延迟(硬件集群上的结果相似)
- CouchDB 文档中提到的所有应该提高性能的东西,尤其是 HTTPD 选项和 simplejson 的 C 扩展都设置正确
- 我使用 CouchDB 网站上推荐的 Ektorp 持久性 API 编写了 couchdb 驱动程序。代码很简单,我为其他数据库系统编写的驱动程序运行良好。
我试图提高吞吐量的方法:
- 在加载阶段使用批量插入。这使得 CouchDB 快很多,但仍然比 MongoDB 慢 7 倍,这与此处发布的基准一致,使用相同的 CouchDB 版本。
CouchDB 运行缓慢的可能解释:
- 必须通过请求文档、修改文档并将其重新提交到数据库来完成更新,这会导致高延迟。然而,这并不能解释低读取吞吐量
问题:您是否看到任何其他提高 CouchDB 性能的方法?
编辑:Delayed_commit 在 couchdb 中设置为 true,所以我开始怀疑强制 fsync 是原因。