我们运营两个双节点代理,每个代理都有完全不同的队列和工作负载。每个盒子有 24 个核心 (H/T) 的 Xeon E5645 @ 2.4GHz 和 48GB RAM,通过千兆 LAN 连接,延迟约 150μs,运行 RHEL 5.6、RabbitMQ 3.1、Erlang R16B,HiPE 关闭。我们已经尝试过启用 HiPE,但它对性能没有明显影响,而且非常崩溃。
对于输入和输出的 1,000/s 和 1,400/s 之间的消息速率,我们似乎已经达到了上限。这是代理范围的,而不是每个队列的。添加更多消费者并不能提高整体吞吐量,只会让特定队列在这个明显的资源“池”中占有更大的份额。
每个队列都在组成代理的两个节点上镜像。我们的发布者和消费者以持久的方式平等地连接到两个节点。我们也注意到速率中类似 ADSL 的不对称;如果我们设法发布大量消息,则传递率会下降到两位数。正如预期的那样,使用未镜像队列进行测试具有更高的吞吐量。队列和交换是持久的,消息不是持久的。
我们想知道我们可以做些什么来改善这种情况。盒子上的 CPU 很好,beam 为 1 个进程占用一个半核心,然后为另外几个进程占用两个核心各 80%。盒子的其余部分基本上是空闲的。我们在用户空间中使用约 20GB 的 RAM,其余部分由系统缓存填充。IO 速率很好。网络很好。
我们可以做任何 Erlang/OTP 调优吗?delegate_count 是默认的 16,有人可以更详细地解释一下这是做什么的吗?