我运行的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卷)上测试了它,结果相似。
答案 0 :(得分:15)
我认为这是一些因素
curl
从头开始构建TCP连接。 (Web浏览器和大多数客户端软件都保留了持久的HTTP / 1.1 keepalive连接池。)但从根本上说,CouchDB会选择更慢的#34;协议,因为它是如此普遍和如此标准。.couch
文件中的随机i / o。您可能会看到磁盘延迟的影响倍增。您可以比较读取文档与读取等效的MySQL行,而不是比较读取文档与读取文件系统文件。注意,我并不是说CouchDB实际上很快而且结果不正确。恰恰相反:CouchDB比许多人预期的要慢。在某种程度上,它有改进和优化的空间;但主要是 CouchDB已经决定这些成本对于它所带来的更广泛的利益是值得的。
CouchDB未能通过基准测试,并且让学院陷入困境。我建议您接下来对CouchDB的全部负载进行基准测试,模拟您对多个并发访问的预期需求,并尽可能接近您对它的实际需求。这将是一个更有帮助的测试,一般来说CouchDB在那里表现令人印象深刻。
也就是说,CouchDB是一个特定于域的数据库,所以你可能会发现你正在寻找一个不同的工具。
答案 1 :(得分:1)
你是如何检索文件的?如果您使用的是某些代码,请包含该代码以及您正在使用的任何库。
或者只需使用curl
来检索文档。例如,我刚做time curl http://localhost:5984/bwah/foo
并获得了.017s中的文件。一个重要的注意事项是我在一台带SSD的机器上。
另外,进行一次读取还不足以建议您可以从CouchDB或任何服务器软件中获得的吞吐量。您需要执行大量请求,然后查看平均时间和中位数。