大多数业务场景需要使用可靠性消息,Kafka在高可靠场景下的性能表现到底如何呢?
本文的压测结果是消息大小100字节、开启和不开启batch,producer的QPS分别可以达到3.6W和24.8W。
在高可靠场景下,微信开源PhxQueue vs Kafka的性能:消息大小为10字节、开启和不开启batch,Kafka的producer的QPS分别可以达到180W/S和9W/S
压测结果用于评估是否可以用于实际的业务场景,所以压测场景并未穷举多种message.size、batch.size以及partitions.size
受压测环境限制(虚拟机CPU100%;在线压测占用网络带宽,影响线上应用)还未压测到broker的I/O极限。
本文描述的高可靠场景是指无数据丢失的场景、消息100%可靠
在线压测时,需要OPS同时在线,共同关注虚拟机带宽资源、线上网络带宽资源的占用情况,避免对同一宿主机上的其他应用产生影响
相关配置
Kafka提供了高可用、高可靠、高吞吐量和低延时的特征,这些特征取决于client和broker端如何配置对应的属性。
本文压测所使用的高可靠配置属性是直接参考之前的一篇文章,这篇文章中的优化durability都涵盖了具体的属性,不再作具体说明。
Kafka官网推荐使用默认的异步刷盘(OS 30秒刷盘一次)来平衡高可靠和高性能
默认的异步刷盘只能保证在broker不发生宕机的情况下,保证消息100%高可靠,基于此,而追求性能的最大化
但是本文采同步刷盘,牺牲一定的性能,满足在任何情况下确保消息100%可靠
性能测试
-
服务器
压测所使用的服务器均是日常使用的服务器。虚拟机部署应用(Kafka的producer),实体机部署存储系统(Kafka的broker)。- 6台虚拟机,其中5台部署producer,1台部署zookeeper
1234CPU: x86_64 Intel Xeon E312xx (Sandy Bridge) @ 2.10GHz 4CPUMemory: 5GBNetwork: 1GB EthernetDisk: 60GB- 3台实体机,部署broker集群
1234CPU: x86_64 Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz 6核 开启超程Memory: 30GBNetwork: 10GB EthernetDisk: 1T PERC H710P
为什么没有压测consumer?
因为业务场景中,consumer的处理逻辑会相对较重,通常是consumer的消息处理速度会比较慢。
- 压测脚本
直接使用kafka_2.11-0.11.0.0的压测脚本kafka-producer-perf-test.sh进行压测
压测脚本:perf-test-producer. sh
|
|
注意:不同版本的kafka自带的压测脚本参数有可能不一样
- 压测场景
消息大小=100字节,topic的分区个数=16
partitions为什么是16?
因为压测过partitions=3、6的场景(不开启batch),broker的IO使用率分别是40%、60%,producer的QPS只能到1.6W
每台虚拟机上启动16个producer进程(nohup ./perf-test-producer.sh &)
-
不开启batch,producer的QPS可以达到3.6W/S
实际的业务场景不存在需要将消息积压到一定量之后再批量发送给broker,而更多的是一旦消息产生就及时发到broker
压测时间:11:02–11:16- I/O
不增加partition,IO使用率一直压不上去。
当partition从6增加到16后,IO使用率从40%增大到80% - NetWork
不增加partitions,网络流量保持在20Mbit/S(partitions=6),网络流量压不上去。
当增大partitions到16后,网络流量增大到50Mbit/S - Memory
cached增长缓慢 - CPU
CPU在35%左右,CPU并不高 - Load
load在8左右,也不高,服务器上是12核,开启超程 - GC
- I/O
-
开启batch,producer的QPS可以达到24.8W/S
batch.size=1000
压测时间:11:52–11:55- I/O
一直保持在80% - NetWork
开启batch后,网络流量从50Mbit/S迅速飙到240Mbit/S - Memory
开启batch后,短短3分钟内cached从10G涨到20G - CPU
保持在40%,变化不大 - Load
保持在9左右,变化不大 - GC
- I/O
-
QPS数据
在压测的过程中,所有producer进程的QPS信息会记录到nohup.out,记录的是单个producer的QPS
5台虚拟机部署producer,每台虚拟机上开启16个producer进程- 不开启batch
12345672308 records sent, 459.9 records/sec (0.04 MB/sec), 398272.1 ms avg latency, 420320.0 max latency.2303 records sent, 460.0 records/sec (0.04 MB/sec), 398268.9 ms avg latency, 420102.0 max latency.2314 records sent, 462.3 records/sec (0.04 MB/sec), 398757.2 ms avg latency, 418233.0 max latency.2323 records sent, 464.0 records/sec (0.04 MB/sec), 396975.2 ms avg latency, 415960.0 max latency.2309 records sent, 461.2 records/sec (0.04 MB/sec), 399178.9 ms avg latency, 419073.0 max latency.2298 records sent, 457.5 records/sec (0.04 MB/sec), 399280.0 ms avg latency, 426313.0 max latency.2303 records sent, 460.0 records/sec (0.04 MB/sec), 398136.1 ms avg latency, 416454.0 max latency.总的QPS=450516=3.6W/S
- 开启batch
123456715904 records sent, 3170.0 records/sec (0.30 MB/sec), 85798.8 ms avg latency, 90976.0 max latency.15776 records sent, 3153.9 records/sec (0.30 MB/sec), 85600.0 ms avg latency, 91577.0 max latency.15936 records sent, 3187.2 records/sec (0.30 MB/sec), 85383.0 ms avg latency, 91503.0 max latency.15904 records sent, 3178.3 records/sec (0.30 MB/sec), 85640.2 ms avg latency, 91587.0 max latency.15776 records sent, 3149.5 records/sec (0.30 MB/sec), 85972.8 ms avg latency, 92308.0 max latency.16024 records sent, 3189.5 records/sec (0.30 MB/sec), 85473.7 ms avg latency, 91592.0 max latency.15896 records sent, 3174.8 records/sec (0.30 MB/sec), 85727.8 ms avg latency, 91356.0 max latency.总的QPS=3100516=24.8W/S
结论
- partition是最小的并发单元
增加partition,可以明显提升IO使用率 - batch直接影响吞吐量
开启batch,可以显著提升网络流量 - 100% no data lose,close batch
message.size=100byte,producer的QPS高达3.6W,IO使用率在80%左右,满足业务场景