Amazon ELB 和 CouchDB 的性能问题

Performance issues with Amazon ELB and CouchDB

我有一个由两个相同的盒子组成的 CouchDB 集群(复制)。它是主-主集群,有两个文档 A 和 B,A 比 B 小四倍,4KB vs 16KB。此外,在启用了粘性会话的 CouchDB 实例前面还有一个 HTTP ELB。我正在观察以下行为:

a) 当我直接从 CouchDB 检索文档时,忽略 ELB,两个文档都表现良好,平均 ~1000 r/s

b) 当我通过 ELB 连接时,我观察到文档 A ~250 r/s 的性能下降。文档 B 仍然表现良好 ~1000r/s

c) 当我设置 HAProxy 而不是 ELB 时,性能没有下降。

我在 ELB 配置中做了一些调整,尝试在跨区域负载平衡、多可用区、粘性会话方面进行不同的设置,但没有任何改进。

我是运行CouchDB 1.6.0,测试用siege 3.0.5.

HAProxy和ELB的唯一区别是ELB使用的是Connection: keep-alive。

原来是 CouchDB 配置的问题。根据 CouchDB 文档 (http://wiki.apache.org/couchdb/Performance#Network):

The HTTP server library Mochiweb, by default sets the TCP socket option SO_NODELAY to false. This means that small data sent to the TCP socket, like the reply to a document write request (or reading a very small document), will not be sent immediately to the network - TCP will buffer it for a while hoping that it will be asked to send more data through the same socket and then send all the data at once for increased performance.

您可以禁用该行为,将以下内容添加到 CouchDB 配置中:

[httpd]
socket_options = [{nodelay, true}]

这就是为什么我在不使用持久连接的情况下观察到更好性能的原因。