kafka集群压测与优化

影响kafka集群性能的因数有多个,网络带宽、cpu、内存、磁盘读写速度、副本数、分区数、broker数量、内存缓存等因素都会影响kafka集群的性能

1.优化kafka集群配置

server.properties配置文件优化

num.network.threads=4
num.io.threads=4
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
num.recovery.threads.per.data.dir=1
log.retention.hours=72

num.network.threads:网络线程数,建议设置为CPU核心数的2倍

num.io.threads:磁盘I/O线程数,建议设置为CPU核心数的2倍

num.recovery.threads.per.data.dir:数据目录用来日志恢复的线程数目,配置多线程可加快恢复速度

log.retention.hours:消息保留时间,不适宜保留太长

socket.send.buffer.bytessocket.receive.buffer.bytes这两个参数控制Kafka Broker与客户端之间的TCP缓冲区大小,建议将它们设置为128KB或256KB,也可以通过以下的方式计算

假设如果您的网络带宽为1Gbps,消息大小为10KB,磁盘吞吐量为100MB/s,可用内存为8GB,则可以计算出以下缓冲区大小:

socket.send.buffer.bytes1Gbps / 8 = 125MB/s,因此可以将其设置为1MB

socket.receive.buffer.bytes100MB/s / 8 = 12.5MB/s,因此可以将其设置为128KB

producer.properties配置文件优化

compression.type=lz4
batch.size=16384
linger.ms=5
buffer.memory=33554432

compression.type这个参数控制消息的压缩方式,如果您的应用程序发送大量的消息,则可以将其设置为gzipsnappy,以减少网络带宽和磁盘使用,一般设置为lz4,用以提升性能

buffer.memory:默认值是 32MB,可以根据实际情况来调整这个值。如果你的应用程序需要发送大量的消息,可以将 buffer.memory 设置为较大的值,例如 1GB,这样可以确保 Producer 有足够的内存缓存消息,但也会消耗更多的内存资源。如果你的应用程序发送的消息比较少,可以将 buffer.memory 设置为较小的值,例如 64MB,这样可以节省内存资源

batch.size:表示每个批次(batch)的大小,即在 Kafka Producer 发送数据时,会将数据先缓存在内存中,当缓存的数据大小达到 batch.size 时,Producer 才会将这些数据一次性发送出去,默认值为 16KB

linger.ms:表示消息在缓存区中等待发送的时间,即如果数据没有达到 batch.size,但是等待了 linger.ms 时间后,Producer 也会将这些数据发送出去,默认值为 0,即数据必须立即发送

这两个参数的配置对 Kafka Producer 性能和消息延迟都有影响。较小的 batch.size 和较大的 linger.ms 可以降低消息延迟,但可能会降低吞吐量;而较大的 batch.size 和较小的 linger.ms 可以提高吞吐量,但可能会增加消息延迟

这两个参数的一些优化见解

1.如果你的应用程序需要低延迟,可以将 batch.size 设置为较小的值,例如 1KB,并将 linger.ms 设置为 0,这样可以尽快将消息发送出去,但可能会影响吞吐量

2.如果你的应用程序需要高吞吐量,可以将 batch.size 设置为较大的值,例如 64KB,并将 linger.ms 设置为较小的值,例如 5ms,这样可以提高吞吐量,但可能会增加消息延迟

3.如果你的应用程序需要同时兼顾延迟和吞吐量,可以将 batch.size 和 linger.ms 都设置为适当的值,例如 16KB 和 10ms

4.如果你的消息大小比较固定,可以根据消息大小来调整 batch.size 的大小,例如如果消息大小为 1KB,可以将 batch.size 设置为 10KB,这样可以确保每个批次中有足够的消息,但不会浪费太多内存

总的来说还是需要根据数据的实际场景来配置,逐步去调整大小,然后观察并发量和延迟,以达到最优的效果

kafka-server-start.sh 启动项的优化

调整 JVM 参数

KAFKA_HEAP_OPTS="-Xmx4G -Xms4G"

一般HEAP 大小不超过主机内存的50%

副本数的优化,一般配置3个,副本数太少不安全,副本数太多,同步数据会占用性能

分区数的优化,按道理来说分区数越大,写入数据的并发量就越大

kafka集群节点数量优化,节点数越多,性能越强大

2.压测kafka集群

首先得另外搭建一台kafka主机,执行压测脚本必须有kafka服务,最好搭建一个zabbix,监控kafka集群主机,可以更好的看出cpu、磁盘io、内存、网络哪一个到达了瓶颈

搭建zabbix参考:zabbix搭建_Apex Predator的博客-优快云博客

配置监控主机参考:zabbix监控linux主机_Apex Predator的博客-优快云博客

 搭建单节点kafka:kafka单节点快速搭建_Apex Predator的博客-优快云博客

 在kafka集群中分别创建3分区的主题和6分区的主题副本数都设置为3看一下压测情况

bin/kafka-topics.sh --create --bootstrap-server 10.1.60.112:9092 --partitions 3 --replication-factor 3 --topic apex

bin/kafka-topics.sh --create --bootstrap-server 10.1.60.112:9092 --partitions 6 --replication-factor 3 --topic cs 

在新建的单节点上执行生产者的压测命令 

 bin/kafka-producer-perf-test.sh --topic apex --producer-props bootstrap.servers=10.1.60.112:9092,10.1.60.114:9092,10.1.60.115:9092 --record-size 1024 --num-records 1000000 --throughput -1

命令解析

--producer-props:指定 Kafka Producer 的配置参数,其中 bootstrap.servers 表示 Kafka Broker 的地址,多个 Broker 地址用逗号分隔

--record-size:每个请求的大小单位为字节,1024字节,即1kb

--num-records:总共 请求的数目,1000000个请求

--throughput:指定 Producer 的吞吐量,单位是消息数/秒。默认值为 -1,表示尽可能快地发送消息

  bin/kafka-producer-perf-test.sh --topic cs --producer-props bootstrap.servers=10.1.60.112:9092,10.1.60.114:9092,10.1.60.115:9092 --record-size 1024 --num-records 1000000 --throughput -1

 先来说一下上面输出的意思是什么

records sent:每秒发送的请求数

records/sec:平均每秒的流量值

avg latency:最小延迟时间

max latency:最大延迟时间

分析对两个不同分区数据的topic进行压测的数据可以看到,3分区的topic平均每秒并发6万左右,6分区的topic平均每秒并发10万左右,所以说分区数越大并发量就越大

看一下zabbix监控下kafka集群主机的性能消耗

 

可以看到并未达到瓶颈,一般来说测试生产者为单节点,更容易达到网络瓶颈,所以建议使用多台生产者机器同时对kafka压测更能测试出kafka集群的极限

在新建的单节点上执行消费者的压测命令 

bin/kafka-consumer-perf-test.sh --topic apex --broker-list 10.1.60.112:9092,10.1.60.114:9092,10.1.60.115:9092 --fetch-size 10000 --messages 1000000 --threads 1

 命令解析

--fetch-size:指定每个拉取请求(fetch request)拉取的最大字节数,这里为"10000"字节

--messages:指定要消费的消息数量,这里为"1000000"条消息

--threads:指定用于消费消息的线程数,这里为"1"个线程,线程数量也会影响消费性能

 bin/kafka-consumer-perf-test.sh --topic cs --broker-list 10.1.60.112:9092,10.1.60.114:9092,10.1.60.115:9092 --fetch-size 10000 --messages 1000000 --threads 1

 先来说一下上面输出的意思是什么

start.time:测试开始时间

end.time:测试结束时间

data.consumed.in.MB:总的消费数据量,单位为MB

MB.sec:消费数据的速率,单位为MB/s

data.consumed.in.nMsg:消费的消息数量

nMsg.sec:消费消息的速率,单位为条消息/s

rebalance.time.ms:消费者重新平衡所需的时间,单位为毫秒

fetch.time.ms:拉取消息所需的时间,单位为毫秒

fetch.MB.sec:拉取数据的速率,单位为MB/s

fetch.nMsg.sec:拉取消息的速率,单位为条消息/s

通过消费以上两个不同topic可以看出,分区数量大小对消费的并发量也有影响,以上的数据不是kafka集群的性能极限,而是消费者节点的性能极限,若是使用多个消费者可以更好的测出kafka集群的极限性能

消费者节点网络性能接近极限值

 kafka集群网络性能还远远没有达到极限

 

 

本人搭建的kafka集群主机单节点配置为4核cpu12GB内存100GB机械磁盘 

<think>好的,我现在需要帮助用户解答关于Kafka集群中网络空闲率的计算和优化方法。首先,我得回忆一下Kafka的相关知识,特别是网络处理方面的内容。用户提到了NetworkProcessorIdle和RequestHandlerIdle这两个指标,根据引用[1],这两个指标对于集群稳定性很重要,当它们较低时,可能意味着性能问题。 首先,网络空闲率应该是指NetworkProcessorIdle的百分比,这表示网络线程的空闲时间占比。计算的话,可能需要通过监控工具来获取这个指标的值。比如引用[4]提到可以使用kafka manager或者JConsole之类的工具来监控。那如何具体计算呢?可能是在监控数据中直接读取这个指标的值,比如JMX中的某个MBean。 然后优化方面,用户的问题需要从硬件、配置、分区等方面考虑。根据引用[2],硬件配置和集群规划很重要,比如网络带宽、磁盘性能。另外,引用[3]提到了分区数和副本因子的配置,调整这些可能影响网络负载。还有,调优线程池配置,比如增加网络线程数,可能减少处理请求的等待时间,从而提高空闲率。 另外,用户可能还希望知道如何监控这些指标,比如使用kafka-producer-perf-test.sh进行,找到瓶颈。引用[2]提到官方提供的试脚本,可以用来评估性能。此外,分区数是否合理,如果分区过多可能导致网络请求分散,增加处理负担,所以需要根据生产速度调整。 需要注意,引用中提到的经验公式:机器数量=2*(峰值生产速度*副本数/100)+1,这可能和集群规模有关,足够的机器可以分摊负载,避免网络线程过载。所以扩容也可能是优化的一部分。 最后,用户可能需要具体的步骤或配置参数,比如调整num.network.threads,或者优化副本同步机制。同时,监控工具的使用方法,如JVisualVM检查线程状态,是否有死锁或阻塞,引用[4]提到这点。 总结一下,回答应该包括计算方法和多个优化方向,引用相关的引用作为支持。还要生成相关问题,可能涉及监控工具、配置参数调整、硬件选择等。</think>### Kafka网络空闲率计算优化方法 #### 一、网络空闲率的定义计算 Kafka网络空闲率(NetworkProcessorIdle)表示网络线程池中处理网络I/O请求的空闲时间占比,计算公式为: $$NetworkProcessorIdle = \frac{\text{网络线程空闲时间}}{\text{总时间周期}} \times 100\%$$ 该指标可通过JMX接口或监控工具(如Kafka Manager、Prometheus)直接获取,对应JMX指标为`kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent`[^1]。 #### 二、优化方法 1. **硬件网络优化** - **带宽扩容**:若网络吞吐量接近物理带宽上限,需升级网卡或采用更高带宽的网络设备[^2]。 - **磁盘隔离**:为Kafka分配独立磁盘(如SSD),避免磁盘I/O竞争影响网络处理效率[^3]。 2. **配置调优** - **调整网络线程数**:修改`num.network.threads`(默认值为3),公式建议: $$num.network.threads = \lceil \text{峰值请求量} / \text{单线程处理能力} \rceil$$ 例如,若单线程每秒处理5000请求,峰值请求量为20000,则至少设置为4[^2]。 - **优化分区副本**:减少跨机房副本同步(调整`replica.fetch.max.bytes`)以降低网络负载[^3]。 3. **请求批处理缩** - 启用生产者端缩(如`compression.type=lz4`)减少数据传输量。 - 增大`batch.size`和`linger.ms`以提高批量发送效率[^2]。 4. **监控扩容** - 定期使用`kafka-producer-perf-test.sh`进行,定位网络瓶颈[^2]。 - 按经验公式扩展集群规模: $$机器数量 = 2 \times \left(\frac{\text{峰值生产速度} \times \text{副本数}}{100}\right) + 1$$ 确保资源冗余[^2]。 #### 三、操作示例 ```bash # 查看NetworkProcessorIdle指标(通过JMX) kafka-run-class kafka.tools.JmxTool --object-name kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent # 修改网络线程数(server.properties) num.network.threads=8 ``` #### 四、引用说明 优化需结合监控数据逐步验证,例如高峰期NetworkProcessorIdle应保持在20%以上[^1]。若指标持续低于阈值,优先检查网络线程配置硬件负载[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值