这是我当前为kafka制作人设置的设置-
batch.size = 5000000 # 5MB
linger.ms = 1000 # 1s
max.block.ms = 10000 # 10s
通过此设置,我能够实现20k msg /秒的吞吐量。但是,我在四核处理器上的CPU利用率仍然限制为70%。我试图增加我的http请求线程(netty IO)无济于事。当卡夫卡生产者正忙于将当前批处理刷新到卡夫卡代理时,卡夫卡生产者是否阻止将新消息附加到缓冲区?我的服务器非常简单-从请求中读取消息,向其中添加一些参数,然后追加到kafka队列中。还有什么其他原因会导致随着Netty线程数量的增加,CPU利用率无法提高以获得更高的吞吐量?
并行生产者请求的数量受到默认为max.in.flight.requests.per.connection
的配置5
的限制。
在config docs中说:
<,客户端将在单个连接上发送的未确认请求的最大数量。请注意,如果将此设置设置为大于1且发送失败,则由于重试(例如,如果启用重试),存在消息重新排序的风险。
[另外,要提高吞吐量,您可以通过不等待来自代理的任何fire-and-forget
来应用acknowledgment生产者模式。这是通过将生产者配置设置为acks = 0
(与默认值1相反)来完成的。但是,这将导致at-most-once
传递语义。
我不知道生产者线程中是否有任何阻塞。 Kafka Producer上的文档提供了更多详细信息:
生产者由一个缓冲空间池和一个I / O后台线程组成,该缓冲池保存尚未传输到服务器的记录,该I / O线程负责将这些记录转换为请求并将它们传输到集群。使用后无法关闭生产者将泄漏这些资源。
send()
方法是异步的。调用时,它将记录添加到暂挂记录发送并立即返回的缓冲区中。这使生产者可以将各个记录分批处理以提高效率。