首页 > 解决方案 > 读取 Kafka 获取请求的 IO 大小

问题描述

发出获取请求时 - 响应大小受各种 Kafka 参数的限制,并且有据可查。但我的问题是——核心的读取 IO 大小是多少。进程必须打开段文件并发出 read() 操作并将数据放入内存。问题是 - 这个 read() 的大小是多少 - 它是一个固定数字还是等于 - max.partition.fetch.bytes?如果是这样,那么如果分区有足够的数据,一个读取 IO 将获得足够的数据来为该分区提供消费者。我尝试查看源代码,但无法弄清楚这个大小。

我这样做的原因是 - 我正在对我的 Kafka 日志文件系统进行基准测试,对于消费者,我想看看文件系统在多大的读取 IO 大小下表现更好,并想看看 Kafka 获取/轮询是否显示相同的模式。

标签: apache-kafka

解决方案


您的问题有两个 I/O:磁盘 i/o 和网络 i/o

磁盘 i/o: Kafka 利用文件系统进行存储和缓存。

如果您正在寻找核心磁盘 I/O 操作大小,那么它是典型的块大小,并且大多数现代操作系统的块大小通常由 PageCache 定义,最高可达 4096 字节(例如 $getconf PAGESIZE 显示您服务器上的大小)

总之:虚拟内存页面映射到文件系统块,文件系统块映射到块设备扇区。

参考代码LogSegment.scala内部使用FileRecord.java,它使用 FileSystem 调用。

Network i/o接下来是 Consumer Fetch 请求,

大多数情况下,Consumer FetchRequest 从特定领导分区代理上的(热数据)PageCache 中获取。根据您的消费者 Kafka 参数(例如,Min/MaxBytes 和 maxWaitMs),它会填充来自 PageCache 的 NIC 请求并通过网络传输。

参考代码:Fetcher.java ( ConsumerNetworkClient )Client.send() 并等待网卡响应。

pagecache 和 sendfile 的这种组合意味着在 Kafka 集群上,消费者大多被赶上,您将不会看到磁盘上的任何读取活动,因为它们将完全从缓存中提供数据。因为 Kafka 使用零拷贝数据传输(Broker → Consumer)

因此,大多数性能调整(除了用于页面缓存和磁盘 i/o 的可用内存)您都可以使用消费者参数,例如最小等待时间和数据包的最大缓冲区大小。

以下是对 Consumption 进行性能调整时需要考虑的一些要点:

在此处输入图像描述


推荐阅读