apache-kafka - 读取 Kafka 获取请求的 IO 大小
问题描述
发出获取请求时 - 响应大小受各种 Kafka 参数的限制,并且有据可查。但我的问题是——核心的读取 IO 大小是多少。进程必须打开段文件并发出 read() 操作并将数据放入内存。问题是 - 这个 read() 的大小是多少 - 它是一个固定数字还是等于 - max.partition.fetch.bytes?如果是这样,那么如果分区有足够的数据,一个读取 IO 将获得足够的数据来为该分区提供消费者。我尝试查看源代码,但无法弄清楚这个大小。
我这样做的原因是 - 我正在对我的 Kafka 日志文件系统进行基准测试,对于消费者,我想看看文件系统在多大的读取 IO 大小下表现更好,并想看看 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 进行性能调整时需要考虑的一些要点:
推荐阅读
- node.js - 是否可以制作特定于项目的“全局”模块?
- performance - Bitboard 64 位机器:对于 4x4 板,我应该使用 int16 还是 int64?
- amazon-web-services - Cloudfront 反向代理 502 外部 API
- python - Reportlabs 写入多个页面作为运输标签(整页)Python
- ubuntu - Ubuntu Snap - 配置挂钩中不可用的阶段包
- .htaccess - 删除 .htaccess 中的 GET 参数并获取 2 个 URL
- algorithm - 检查 IP 地址是否在该本地网络上?
- ios - 有没有办法让 NEHotspotConfigurationManager 同意加入网络一次?
- python - 如何在程序中返回 mpiexec -n 参数?
- flask - 如何在烧瓶的另一条路线中使用一条路线中的变量?