一个连接开多少 channel 合适?channel 多了会不会拖慢?想提高吞吐,该多开 channel 还是多开连接?这篇量了上限、每个 channel 的开销,以及 channel 和连接两种扩展方式各自的吞吐。
协商后连接上的 channel_max = 2047(pika 默认请求 0 = 不限制,由 broker 在 Connection.Tune 里给出的 2047 决定) 成功开到第 2047 个 channel 后,下一个失败: NoFreeChannels: list_connections 的 channels 列: 2047
broker 在 Connection.Tune 里告诉客户端 channel_max(默认 2047),客户端协商后不能超过。超过时客户端库(这里是 pika)直接抛 NoFreeChannels。
channel 数 Erlang 进程增量 内存增量 每个 channel 100 407 2.5 MiB 25.3 KiB / 4.1 进程 1000 4007 17.8 MiB 18.2 KiB / 4.0 进程 2000 8006 44.2 MiB 22.6 KiB / 4.0 进程
每个 channel 在 broker 里约 4 个 Erlang 进程、18~25 KiB,线性增长;2000 个 channel 就是 8006 个进程、约 44 MiB。
1 个连接 × 1 个 channel: 2635 ms 37945 条/秒 1 个连接 × 4 个 channel: 2689 ms 37188 条/秒 1 个连接 × 16 个 channel: 2688 ms 37197 条/秒 1 个连接 × 64 个 channel: 2779 ms 35980 条/秒
同一个连接上开 1、4、16、64 个 channel 并轮流发布,吞吐都在 36000~38000 条/秒,没有区别。channel 的价值是隔离(各自的错误、确认、消费者),不是并行度。
1 个连接(各 50000 条,共 50000 条): 最慢的一个用了 1358 ms;合计 36805 条/秒 2 个连接(各 50000 条,共 100000 条): 最慢的一个用了 1479 ms;合计 67609 条/秒 4 个连接(各 50000 条,共 200000 条): 最慢的一个用了 2106 ms;合计 94976 条/秒 8 个连接(各 50000 条,共 400000 条): 最慢的一个用了 4087 ms;合计 97867 条/秒
多开连接(每个连接一个客户端进程)才增加总吞吐:到 4 个连接时 94976 条/秒,8 个连接就不再增长了(机器 CPU 被客户端和 broker 共用)。