主仓库包含一个脚本 (bench/bench.py),它在 EC2 上自动化运行分布式基准测试。
它会启动 N 个节点,其中一些运行 nsqd,另一些运行负载生成工具 (PUB 和
SUB),然后解析它们的输出以提供聚合总量。
以下运行反映了默认参数,使用 6 个 c3.2xlarge,这是支持 1gbit 链接的最便宜实例类型。
3 个节点运行 nsqd 实例,其余节点运行 bench_reader (SUB) 和 bench_writer (PUB) 的实例,
以根据基准测试模式生成负载。
$ ./bench/bench.py --access-key=... --secret-key=... --ssh-key-name=...
[I 140917 10:58:10 bench:102] launching 6 instances
[I 140917 10:58:12 bench:111] waiting for instances to launch...
...
[I 140917 10:58:37 bench:130] (1) bootstrapping ec2-54-160-145-64.compute-1.amazonaws.com (i-0a018ce1)
[I 140917 10:59:37 bench:130] (2) bootstrapping ec2-54-90-195-149.compute-1.amazonaws.com (i-0f018ce4)
[I 140917 11:00:00 bench:130] (3) bootstrapping ec2-23-22-236-55.compute-1.amazonaws.com (i-0e018ce5)
[I 140917 11:00:41 bench:130] (4) bootstrapping ec2-23-23-40-113.compute-1.amazonaws.com (i-0d018ce6)
[I 140917 11:01:10 bench:130] (5) bootstrapping ec2-54-226-180-44.compute-1.amazonaws.com (i-0c018ce7)
[I 140917 11:01:43 bench:130] (6) bootstrapping ec2-54-90-83-223.compute-1.amazonaws.com (i-10018cfb)
此基准测试仅测量生产者吞吐量,没有额外负载。消息大小为 100 字节,消息分布在 3 个主题上。
$ ./bench/bench.py --access-key=... --secret-key=... --ssh-key-name=... --mode=pub --msg-size=100 run
[I 140917 12:39:37 bench:140] launching nsqd on 3 host(s)
[I 140917 12:39:41 bench:163] launching 9 producer(s) on 3 host(s)
...
[I 140917 12:40:20 bench:248] [bench_writer] 10.002s - 197.463mb/s - 2070549.631ops/s - 4.830us/op
入口流量为 ~2.07mm 条消息/秒,消耗总带宽 197mb/s。
此基准测试通过同时服务生产者和消费者,更准确地反映真实世界条件。同样,消息大小为 100 字节,消息分布在 3 个主题上,每个主题有一个 单一 通道(每个通道 24 个客户端)。
$ ./bench/bench.py --access-key=... --secret-key=... --ssh-key-name=... --msg-size=100 run
[I 140917 12:41:11 bench:140] launching nsqd on 3 host(s)
[I 140917 12:41:15 bench:163] launching 9 producer(s) on 3 host(s)
[I 140917 12:41:22 bench:186] launching 9 consumer(s) on 3 host(s)
...
[I 140917 12:41:55 bench:248] [bench_reader] 10.252s - 76.946mb/s - 806838.610ops/s - 12.706us/op
[I 140917 12:41:55 bench:248] [bench_writer] 10.030s - 80.315mb/s - 842149.615ops/s - 11.910us/op
入口流量为 ~842k 条消息/秒,出口流量为 ~806k 条消息/秒,消耗总带宽 156mb/s,
此时 nsqd 节点上的 CPU 容量已达到最大。通过引入消费者,nsqd 需要维护每个通道的飞行中记账,因此负载自然更高。
消费者数字略低于生产者,因为消费者发送的命令数量是生产者的两倍(每条消息必须发送一个 FIN 命令),这会影响吞吐量。
添加另外 2 个节点(一个 nsqd 和一个负载生成节点)可以达到超过 1mm 条消息/秒:
$ ./bench/bench.py --access-key=... --secret-key=... --ssh-key-name=... --msg-size=100 run
[I 140917 13:38:28 bench:140] launching nsqd on 4 host(s)
[I 140917 13:38:32 bench:163] launching 16 producer(s) on 4 host(s)
[I 140917 13:38:43 bench:186] launching 16 consumer(s) on 4 host(s)
...
[I 140917 13:39:12 bench:248] [bench_reader] 10.561s - 100.956mb/s - 1058624.012ops/s - 9.976us/op
[I 140917 13:39:12 bench:248] [bench_writer] 10.023s - 105.898mb/s - 1110408.953ops/s - 9.026us/op
免责声明:请记住,NSQ 设计用于分布式使用。单节点性能很重要,但并非我们追求的终极目标。而且, 基准测试很愚蠢,但这里还是提供了一些来点燃激情:
$ ./bench.sh
results...
PUB: 2014/01/12 22:09:08 duration: 2.311925588s - 82.500mb/s - 432539.873ops/s - 2.312us/op
SUB: 2014/01/12 22:09:19 duration: 6.009749983s - 31.738mb/s - 166396.273ops/s - 6.010us/op$ ./bench.sh
results...
PUB: 2014/01/13 16:58:05 duration: 1.411492441s - 135.130mb/s - 708469.965ops/s - 1.411us/op
SUB: 2014/01/13 16:58:16 duration: 5.251380583s - 36.321mb/s - 190426.114ops/s - 5.251us/op