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}]
这就是为什么我在不使用持久连接的情况下观察到更好性能的原因。
我有一个由两个相同的盒子组成的 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}]
这就是为什么我在不使用持久连接的情况下观察到更好性能的原因。