kafka吞吐量测试

除了基本的console-producer和console-consumer脚本可以用于简单测试消息的发送和接收外,kafka还提供了性能吞吐量测试脚本,它们分别是kafka-producer-perf-test.sh和kafka-consumer-perf-test.sh脚本。

一、生产者吞吐量

kafka-producer-perf-test.sh是用于测试生产者吞吐量的,具体命令入下

bin/kafka-producer-perf-test.sh  --topic test_topic --num-records 500000 --record-size 200 --throughput -1 --producer-props 
bootstrap.servers=localhost:9092,localhost:9093,localhost:9094 acks=1

运行结果:

   以上结果说明在这台机器上运行一个kafka producer的吞吐量是3mb/s,即占用带宽是24mb/s,平均每秒发送的17411条数据,平均延时是4.582秒,最大延时是8.337秒,平均有50%的消息发送需要4.305秒,95%需要6.864秒,99%需要7.385秒,99.9需要 8.301秒。

二、消费者吞吐量

kafka-consumer-perf-test.sh是用于测试消费者吞吐量的,具体命令入下

bin/kafka-consumer-perf-test.sh --broker-list localhost:9092,localhost:9093,localhost:9094
--fetch-size 200 --messages 500000 --topic test_topic

运行结果:

  以上是测试消费50万条信息的consumer吞吐量,结果表明,在改环境中consumer在11秒多时间内总共消费了95M的消息,因此吞吐量是8M/s,即占用带宽是64M/s。

三、kafka高性能高吞吐的原因

(1)、磁盘顺序读写:保证了消息的堆积

顺序读写:磁盘会预读,预读即在读取的起始地址连续读取多个页面,主要时间话费在了传输时间上,而这个时间两种读写可以认为是一样的。

随机读写:因为数据没有在一起,将预读的地址浪费掉了。需要多次寻道(磁道)和旋转延迟。而这个时间可能是出传输时间的许多倍。

(2)、零拷贝:避免CPU将数据从一块存储拷贝到另一块存储的技术

【零拷贝:磁盘文件->内核空间读取缓冲区->网卡接口->消费者进程】

传统的数据复制:读取磁盘文件数据到内核缓冲区;将内核缓冲区的数据copy到用户缓冲区;将用户缓冲区的数据copy到socket的发送缓冲区;将

socket发送缓冲区中的数据发送到网卡,进行传输。

(3)、分区分段+索引

kafka的message消息实际上是分布式存储在一个一个小的segment中的,每次文件操作也是直接操作的segment。为了经一部的优化查询,kafka又默认

为分段后的数据文件建立了索引文件,就是文件系统上的.index文件。这种分区分段+索引的设计,不仅提高了读取的效率,同时也提高了数据操作的并行度。

(4)、批量压缩:多条消息一起压缩,降低带宽

(5)、批量读写

(6)、直接操作page cache,而不是jvm、避免GC耗时及对象创建耗时,且读写速度更高,进程重启、缓存也不会丢失。

posted @ 2020-02-26 21:44  炫舞风中  阅读(1587)  评论(1编辑  收藏  举报