3.4. 通过增加 I/O 线程来提高请求处理吞吐量
网络线程处理对 Kafka 集群的请求,如从客户端应用程序生成和获取请求。生成请求将置于请求队列中。响应放置在响应队列中。
每个监听器的网络线程数量应该反映了复制因素以及客户端制作者和与 Kafka 集群交互的用户的活动级别。如果您要拥有大量请求,您可以使用闲置时间线程数量来增加线程数量,以确定何时添加更多线程。
要减少拥塞并规范请求流量,您可以限制请求队列中允许的请求数。当请求队列已满时,所有传入流量都会被阻断。
I/O 线程从请求队列获取请求来处理它们。添加更多线程可以提高吞吐量,但 CPU 内核和磁盘带宽的数量会实施实际的上限。至少,I/O 线程的数量应等于存储卷的数量。
# ... num.network.threads=3 1 queued.max.requests=500 2 num.io.threads=8 3 num.recovery.threads.per.data.dir=4 4 # ...
所有代理的线程池的配置更新可能会在集群级别动态发生。这些更新仅限于当前大小的一半和两倍的当前大小。
提示
以下 Kafka 代理指标可帮助处理所需的线程数量:
-
kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent
提供平均网络线程闲置的指标。 -
kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent
提供平均 I/O 线程闲置的指标。
如果有 0% 空闲时间,则使用所有资源,这意味着添加更多线程可能很有用。当闲置时间低于 30% 时,性能可能会开始下降。
如果线程因为磁盘数量而较慢或限制,您可以尝试增加网络请求的缓冲区的大小,以提高吞吐量:
# ... replica.socket.receive.buffer.bytes=65536 # ...
另外,增加 Kafka 可以接收的最大字节数:
# ... socket.request.max.bytes=104857600 # ...