本测试主要是为了测试VDL端对端的性能指标:
- 单独写入性能参数
- 单独读取性能参数
- 读写混合情况下,读写的性能参数
- 批量写入条数和接收缓存大小,对读写性能的影响
性能参数分为以下几个维度:
- TPS
- Latency:延迟,分为四个维度,Avg,95th表示第95个百分位数,99th表示第99个百分位数,max表示最大值,Avg表示平均延迟。批量请求中单条延迟计算方式如下: ,Tn表示一次批量写入/读取N条消息消耗的时间,rtt表示写入端或读取端到VDL server之间的网络rtt。
- Throughput:吞吐量
测试工具:
- produce:通过编写性能测试程序(代码位于VDL的tools/vdl_perf/produce_perf/produce_perf.go)测试。
- consume:VDL由于没有实现组消费协议,不能兼容kafka官方消费性能测试脚本:kafka-consumer-perf-test.sh。通过编写性能测试程序(代码位于VDL的tools/vdl_perf/consume_perf/consume_perf.go)测试。
VDL集群服务器配置
a) Leader:
- IP:192.168.0.1
- CPU:32核 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
- Mem:32GB
- 磁盘:SATA 512GB
- 网卡:1000Mb
b) Follower1:
- IP:192.168.0.2
- CPU:32核 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
- Mem:32GB
- 磁盘:SATA 512GB
- 网卡:1000Mb
c) Follower2:
- IP:192.168.0.3
- CPU:32核 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
- Mem:32GB
- 磁盘:SATA 512GB
- 网卡:1000Mb
读写Client服务器配置
a) 读Client所在服务器配置:
- IP:192.168.0.2
- CPU:32核 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
- Mem:32GB
- 磁盘:SATA 512GB
- 网卡:1000Mb
b) 写Client所在服务器配置:
- IP:192.168.0.3
- CPU:32核 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
- Mem:32GB
- 磁盘:SATA 512GB
- 网卡:1000Mb
由于只有三台机器,读和写部署在Follower机器上
只写的情况下,写入消息大小分为四种类型:100Byte、500Bytes、1024Byte和4096Byte,通过调整每一次写入的批量消息条数,来测试VDL写入性能指标。消息总条数为1000000,同步发送模式。批量条数分为:1条、10条、25条和50条。测试数据如下表所示:
单个消息100Byte,发送性能数据如下表所示:
性能指标 批量条数 | TPS | Latency | Throughput |
---|---|---|---|
1 | 2467.52 | Avg: 041 ms 95th: 0.46 ms 99th: 0.57ms max: 3.64ms | 0.25 MB/sec |
10 | 7481.23 | Avg: 0.16 ms 95th: 0.17 ms 99th: 0.18ms max: 1.34ms | 0.75 MB/sec |
25 | 13759.55 | Avg: 0.10 ms 95th: 0.11 ms 99th: 0.12ms max: 0.73ms | 1.38 MB/sec |
50 | 18524.29 | Avg: 0.08 ms 95th: 0.09 ms 99th: 0.10ms max: 0.76 ms | 1.85 MB/sec |
表1:写入Message size为100Byte的性能数据
单个消息500Byte,写入性能数据如下表所示:
性能指标 批量条数 | TPS | Latency | Throughput |
---|---|---|---|
1 | 2272.75 | Avg: 0.44 ms 95th: 0.49 ms 99th: 0.61ms max: 3.20 ms | 1.14 MB/sec |
10 | 6779.02 | Avg: 0.17 ms 95th: 0.18 ms 99th: 0.21ms max: 1.25 ms | 3.40MB/sec |
25 | 11662.81 | Avg: 0.11 ms 95th: 0.12 ms 99th: 0.25ms max: 0.80 ms | 5.83 MB/sec |
50 | 16377.21 | Avg: 0.09 ms 95th: 0.10 ms 99th: 0.22ms max: 0.83 ms | 8.19 MB/sec |
表2:写入Message size为500Byte的性能数据
单个消息1024Byte,写入性能数据如下表所示:
性能指标 批量条数 | TPS | Latency | Throughput |
---|---|---|---|
1 | 2192.89 | Avg: 0.46 ms 95th: 0.49 ms 99th: 0.63 ms max: 2.74 ms | 2.25 MB/sec |
10 | 5151.39 | Avg: 0.22 ms 95th: 0.23 ms 99th: 0.37 ms max: 1.60 ms | 5.28 MB/sec |
25 | 10131.88 | Avg: 0.13 ms 95th: 0.13 ms 99th: 0.32ms max: 1.11 ms | 12.34 MB/sec |
50 | 13989.55 | Avg: 0.10 ms 95th: 0.11 ms 99th: 0.25ms max: 0.79 ms | 14.33 MB/sec |
表3:写入Message size为1024Byte的性能数据
单个消息4096 Byte,发送性能数据如下表所示:
性能指标 批量条数 | TPS | Latency | Throughput |
---|---|---|---|
1 | 1310.62 | Avg: 0.76 ms 95th: 0.80 ms 99th: 1.09 ms max: 3.86 ms | 5.37 MB/sec |
10 | 3670.12 | Avg: 0.30 ms 95th: 0.31 ms 99th: 0.82 ms max: 2.33 ms | 15.03 MB/sec |
25 | 5307.57 | Avg: 0.22 ms 95th: 0.24 ms 99th: 0.57 ms max: 2.07 ms | 21.74 MB/sec |
50 | 6397.69 | Avg: 0.19 ms 95th: 0.21 ms 99th: 0.52ms max: 0.93 ms | 26.20 MB/sec |
表4:写入Message size为4096 Byte的性能数据
只读的情况下,消息大小分为四种类型:100Byte、500Bytes、1024Byte和4096Byte,通过设置fetch.message.max.bytes参数来控制每次批量获取的数据大小,默认是1024KB。测试命令每次批量读取大小设置:32KB、64KB、256KB和1024KB,消息总条数为1000000。测试数据如下表所示:
单个消息100Byte,读取性能数据如下表所示:
性能指标 fetch size(KB) | TPS | Latency | Throughput |
---|---|---|---|
32 | 141976.31 | Avg: 0.04 ms 95th: 0.03 ms 99th: 0.17 ms max: 0.74 ms | 13.54 MB/sec |
64 | 148044.78 | Avg: 0.04 ms 95th: 0.10 ms 99th: 0.11ms max: 0.30 ms | 14.12 MB/sec |
256 | 149981.98 | Avg: 0.04 ms 95th: 0.05ms 99th: 0.05ms max: 0.10 ms | 14.30 MB/sec |
1024 | 146530.05 | Avg: 0.04 ms 95th: 0.04 ms 99th: 0.05ms max: 0.05 ms | 13.97 MB/sec |
表5:读取单条消息大小为100Byte的性能数据
单个消息500Byte,接收性能数据如下表所示:
性能指标 fetch size(KB) | TPS | Latency | Throughput |
---|---|---|---|
32 | 95393.37 | Avg: 0.04 ms 95th: 0.03 ms 99th: 0.31ms max: 0.57 ms | 45.49MB/sec |
64 | 89992.53 | Avg: 0.04 ms 95th: 0.16 ms 99th: 0.18ms max: 0.64 ms | 42.91MB/sec |
256 | 93553.20 | Avg: 0.04 ms 95th: 0.07 ms 99th: 0.08ms max: 0.21 ms | 44.61 MB/sec |
1024 | 92756.42 | Avg: 0.04 ms 95th: 0.05 ms 99th: 0.06ms max: 0.08 ms | 44.23 MB/sec |
表6:读取单条消息大小为500Byte的性能数据
单个消息1024Byte,接收性能数据如下表所示:
性能指标 fetch size(KB) | TPS | Latency | Throughput |
---|---|---|---|
32 | 60351.86 | Avg: 0.05 ms 95th: 0.03 ms 99th: 0.47ms max: 3.15 ms | 58.94 MB/s |
64 | 62317.28 | Avg: 0.05 ms 95th: 0.24 ms 99th: 0.26ms max: 3.52 ms | 60.86 MB/sec |
256 | 61700.67 | Avg: 0.05 ms 95th: 0.09 ms 99th: 0.13ms max: 0.20 ms | 60.25 MB/sec |
1024 | 61843.92 | Avg: 0.05 ms 95th: 0.06 ms 99th: 0.06ms max: 0.07 ms | 60.39 MB/sec |
表7:读取单条消息大小为1024Byte的性能数据
单个消息4096Byte,接收性能数据如下表所示:
性能指标 fetch size(KB) | TPS | Latency | Throughput |
---|---|---|---|
32 | 20521.12 | Avg: 0.08 ms 95th: 0.04 ms 99th: 1.49ms max: 13.18 ms | 80.16 MB/s |
64 | 20639.79 | Avg: 0.08 ms 95th: 0.74 ms 99th: 0.77 ms max: 3.05 ms | 80.62 MB/sec |
256 | 20729.74 | Avg: 0.08 ms 95th: 0.21 ms 99th: 0.29ms max: 2.31 ms | 80.98 MB/sec |
1024 | 20469.26 | Avg: 0.08 ms 95th: 0.10 ms 99th: 0.12ms max: 0.27 ms | 79.96 MB/sec |
表8:读取单条消息大小为4096 Byte的性能数据
在读写并发的情况下,我们来测试VDL的端对端读写性能参数。在一台服务器上同步写入消息到VDL,同时在另一台服务器上读取数据。写入消息大小分为四种类型:100Byte、500Bytes、1024Byte和4096Byte,消息总条数为1000000。我们测试两组数据:
-
读写并发场景1:写入端的batch为25,读取端的fetch.message.max.bytes为32KB。与写入和读取client默认配置基本相同。
-
读写并发场景2: 写入的batch条数为50,读取端fetch.message.max.bytes都为256KB,可以保证一次批量写入50条大小为4096Byte的消息。对应着logstore性能测试的最大写入和读取情况(写入和读取50条4096Byte消息)。
默认情况下写入和读取性能数据如下表所示:
性能指标 message size(B) | TPS | Latency | Throughput |
---|---|---|---|
100 | 13960.63 | Avg: 0.10 ms 95th: 0.11 ms 99th: 0.14ms max: 1.51 ms | 1.40 MB/sec |
500 | 11716.19 | Avg: 0.11 ms 95th: 0.13 ms 99th: 0.25ms max: 1.35 ms | 5.86 MB/sec |
1024 | 9651.97 | Avg: 0.13 ms 95th: 0.15 ms 99th: 0.33ms max: 1.60 ms | 9.88 MB/sec |
4096 | 4468.15 | Avg: 0.25 ms 95th: 0.58 ms 99th: 0.69ms max: 2.16 ms | 18.30 MB/sec |
表8:读写并发场景1写入不同消息大小的性能数据
性能指标 message size(B) | TPS | Latency | Throughput |
---|---|---|---|
100 | 135105.50 | Avg: 0.04 ms 95th: 0.03 ms 99th: 0.20ms max: 0.25 ms | 12.88 MB/sec |
500 | 79935.00 | Avg: 0.04 ms 95th: 0.03 ms 99th: 0.36ms max: 2.24 ms | 38.12 MB/sec |
1024 | 53170.41 | Avg: 0.05 ms 95th: 0.03 ms 99th: 0.55ms max: 4.84 ms | 38.73 MB/sec |
4096 | 16442.51 | Avg: 0.09 ms 95th: 0.04 ms 99th: 1.75ms max: 26.31 ms | 64.23 MB/sec |
表9:读写并发场景1读取不同消息大小的性能数据
写入batch条数为50和读取缓存是256KB情况下,发送和接收性能数据如下表所示:
性能指标 message size(B) | TPS | Latency | Throughput |
---|---|---|---|
100 | 18552.64 | Avg: 0.08ms 95th: 0.09 ms 99th: 0.15 ms max: 0.82 ms | 1.86 MB/sec |
500 | 15744.89 | Avg: 0.09ms 95th: 0.10 ms 99th: 0.23 ms max: 1.36 ms | 7.87 MB/sec |
1024 | 11877.23 | Avg: 0.05 ms 95th: 0.10 ms 99th: 0.15 ms max: 0.52 ms | 12.16 MB/sec |
4096 | 4939.73 | Avg: 0.23ms 95th: 0.30 ms 99th: 0.63ms max: 1.55 ms | 20.23 MB/sec |
表10:读写并发场景2写入不同消息大小的性能数据
性能指标 message size(B) | TPS | Latency | Throughput |
---|---|---|---|
100 | 126745.48 | Avg: 0.04 ms 95th: 0.05 ms 99th: 0.06ms max: 0.06 ms | 12.09MB/sec |
500 | 77246.05 | Avg: 0.04 ms 95th: 0.08 ms 99th: 0.11ms max: 0.29 ms | 36.83 MB/sec |
1024 | 49514.51 | Avg: 0.05 ms 95th: 0.10 ms 99th: 0.15ms max: 0.52 ms | 48.35 MB/sec |
4096 | 13774.08 | Avg: 0.10 ms 95th: 0.30 ms 99th: 0.48ms max: 2.01 ms | 53.80 MB/sec |
表11:读写并发场景2读取不同消息大小的性能数据
通过对比测试,可以发现:
-
总体上,VDL读写性能较为稳定。
-
在单独写的情况下,随着批量条数不断增加,TPS不断提高,并且延时不断下降。
-
在单独读取的情况下,fetch.message.max.bytes对读取TPS和延迟,基本没有影响,也就是说32KB的默认大小,足够了。
-
在读写并发的情况下,写入TPS和延迟并未受到影响,因为写操作都是在尾部追加,和catch up读不冲突。读取TPS相当于单独读的90%左右,延迟基本相同。
-
在读写并发的情况下,随着批量写入条数增大,写TPS会提高,同时写延迟也略有增加。读取的话默认情况下的fetch.message.max.bytes反而比缓存是256KB的TPS稍高。所以建议默认设置即可。