为什么来自CouchDB的读取速度如此之慢? (1.5MB / s左右)

时间:2012-03-21 15:01:06

标签: performance couchdb

我运行的CouchDB(1.1.1)服务器包含大量400-600KB大小的文档。

如果我从数据库(而不是从视图,只是原始文档)中获取完整文档,则需要200-400ms才能完成,这相当于大约1.5MB / s的吞吐量。

如果我将相同的数据写入磁盘上的原始文件,则加载速度为10-20ms(约25-50 MB / s)。

我希望CouchDB有一些开销,但是一个数量级(和一些)看起来很疯狂,本质上是一个读取!

任何人都可以阐明为什么会出现这种情况?

更新:根据下面的要求,来自curl的时间:

# time curl http://localhost:5984/[dbname]/[documentname]

real    0m0.684s
user    0m0.004s
sys     0m0.020s

获取的文档为642842字节。我在标准1TB硬盘和EC2实例(EBS卷)上测试了它,结果相似。

2 个答案:

答案 0 :(得分:15)

我认为这是一些因素

  1. 您正在通过HTTP获取,这基本上是一种更高延迟的协议。特别是,您使用curl从头开始构建TCP连接。 (Web浏览器和大多数客户端软件都保留了持久的HTTP / 1.1 keepalive连接池。)但从根本上说,CouchDB会选择更慢的#34;协议,因为它是如此普遍和如此标准。
  2. 您的文档尺寸较大,适用于CouchDB。大多数文档是单个或两位数的KB,而不是三倍。 CouchDB在一个大吞吐量中对JSON进行编码/解码(即它不是从磁盘流式传输的。)
  3. EC2(甚至是EBS)i / o不仅非常适合数据库(它本身具有高延迟),但它也会随着您的邻居生成与您竞争的未知I / O突发而波动。
  4. CouchDB是文件系统之上的文件系统。 .couch文件看起来很像文件系统本身。所以你的效率低​​下。 .couch文件和元数据需要对存储进行随机i / o操作;阅读文档的需要.couch文件中的随机i / o。您可能会看到磁盘延迟的影响倍增。您可以比较读取文档与读取等效的MySQL行,而不是比较读取文档与读取文件系统文件。
  5. 注意,我并不是说CouchDB实际上很快而且结果不正确。恰恰相反:CouchDB比许多人预期的要慢。在某种程度上,它有改进和优化的空间;但主要是 CouchDB已经决定这些成本对于它所带来的更广泛的利益是值得的。

    CouchDB未能通过基准测试,并且让学院陷入困境。我建议您接下来对CouchDB的全部负载进行基准测试,模拟您对多个并发访问的预期需求,并尽可能接近您对它的实际需求。这将是一个更有帮助的测试,一般来说CouchDB在那里表现令人印象深刻。

    也就是说,CouchDB是一个特定于域的数据库,所以你可能会发现你正在寻找一个不同的工具。

答案 1 :(得分:1)

你是如何检索文件的?如果您使用的是某些代码,请包含该代码以及您正在使用的任何库。

或者只需使用curl来检索文档。例如,我刚做time curl http://localhost:5984/bwah/foo并获得了.017s中的文件。一个重要的注意事项是我在一台带SSD的机器上。

另外,进行一次读取还不足以建议您可以从CouchDB或任何服务器软件中获得的吞吐量。您需要执行大量请求,然后查看平均时间和中位数。