随机操作的低CouchDB性能

时间:2015-09-06 11:59:13

标签: performance mongodb couchdb benchmarking ycsb

我使用YCSB基准测试工具对Couchdb和Mongodb的性能进行基准测试。不幸的是,我似乎做错了,因为单个随机操作的性能差异很大:

工作负载A (50/50读取/更新),16个查询线程,120秒运行时间(结果与20分钟运行时非常相似):

CouchDB 1.6.1:总吞吐量: 1076 ops / sec ,第99百分位读取延迟为13毫秒,第99百分位更新延迟为13毫秒

MongoDB 3.0.6:总吞吐量: 11203 ops / sec ,第99百分位读取延迟为1毫秒,第99百分位更新延迟为1毫秒

正如您所看到的,CouchDB对随机读取和更新的速度非常慢。文档建议使用批量操作,这可能适用于插入,但我不知道如何考虑YCSB逐个要求读取的批量读取。

测试环境:

  • Ubuntu 14.04 64位在启用了VT-D的i7主机上的虚拟盒子上,2个核心,2GB内存(虽然我用专用机器得到了类似的结果)
  • 工作集/数据库很容易适合ram
  • Localhost服务器,没有硬件网络延迟(硬件群集上的结果类似)
  • CouchDB文档中提到的所有应该提高性能的东西,尤其是simplejson的HTTPD选项和C扩展都是正确设置
  • 我使用CouchDB网站上推荐的Ektorp持久性API编写了couchdb驱动程序。代码很简单,我为其他数据库系统编写的驱动程序运行正常。

我尝试提高吞吐量:

  • 在装载阶段使用批量插件。这使得CouchDB更快,但仍然比MongoDB慢7倍,这与使用相同CouchDB版本的基准发布here一致。

CouchDB缓慢的可能解释:

  • 更新必须通过请求文档,修改文档并将其重新提交到数据库来完成,这会导致高延迟。但是,这并不能解释低读取吞吐量

问题:您是否看到了其他改善CouchDB性能的方法?

编辑:在couchdb中将delayeded_commit设置为true,因此我开始怀疑forced-fsync是原因。

1 个答案:

答案 0 :(得分:1)

这里的答案很简单:CouchDB确保所有写入都使用fsync()调用命中磁盘,而MongoDB允许将它们保留在内存中一段时间​​并告诉您一切正常。在您丢失数据时,下一次意外关机。 RAM-vs-disk是它们之间的主要性能因素。

接下来是协议:HTTP是文本,而MongoDB使用自己的二进制文件。无需说明,二进制协议更加紧凑和高效。

但这里的主要问题是你的基准是合成的。您假定您的数据库用于愚蠢的读写,如数据包,而数据库则用于更复杂的操作,如查询,索引查找,连接,数据验证等。这里的业务逻辑很重要。

对于更真实的基准测试,您应该使用一些应用程序并使其与数据库和基准业务工作流程一起使用,而不是盲读/写。很确定,您的数字将被均衡,因为业务逻辑比任何数据库都要慢得多。

所以我很抱歉你浪费你的时间。