Kafka 配置参数性能调优建议

文章目录

  • 1、生产者调优
    • batch.size(重要)
    • linger.ms
    • compression.type
    • acks(重要)
    • buffer.memory
    • max.in.flight.requests.per.connection(重要)
    • message.max.bytes(重要)
  • 2、消费者调优
    • fetch.min.bytes(重要)
    • fetch.max.wait.ms(重要)
    • max.poll.records(重要)
    • auto.offset.reset(重要)
    • session.timeout.ms
    • heartbeat.interval.ms
  • 3、Broker 调优
    • num.network.threads
    • num.io.threads
    • log.flush.interval.messages(重要)
    • log.flush.interval.ms(重要)
    • num.replica.fetchers
    • auto.create.topics.enable
    • unclean.leader.election.enable
    • log.retention.hours

1、生产者调优

batch.size(重要)

建议:64KB ~ 1MB

batch.size指的是生产者在将消息发送到 Broker 之前,会将多条消息收集到一个批次进行发送。

增大batch.size可以显著减少网络请求次数,因为每次发送更多的消息,从而提高了网络传输的效率,有助于提升整体的吞吐量

但是batch.size调整过大,也会带来一定的延迟,因为生产者需要等待更多的消息填满批次,如果批次一直无法填满,消息就会在生产者端停留更长时间,直到达到其他触发发送的条件。在高吞吐量且对延迟要求不是特别苛刻的场景,可以适当增大该值

linger.ms

建议:10 ~ 100ms

linger.ms是生产者等待batch.size填满的时间。

当设置该值后,即使没有填满,只要到了等待时间 linger.ms 值,生产者也会将当前批次的消息发送出去。

增大 linger.ms 可以让生产者有更多的时间去收集消息,从而形成更大的批次,提升吞吐量。这样消息在生产者端等待的时间会变长,会增加消息的延迟。在一些允许一定延迟的批量数据处理场景中,可以适当增大该值来提高吞吐量。

compression.type

建议:snappy 或 lz4

用于减少生产者发送到 Broker 的数据量。使用compression.type可以将消息进行压缩后再传输,这样可以有效节省网络带宽,提高网络传输效率。

snappy 压缩算法的特点是压缩和解压缩速度快,对 CPU 资源的消耗相对较低,适用于对压缩和解压缩速度要求较高的场景;lz4 同样具有较高的压缩和解压缩速度,并且在压缩比上可能比 snappy 稍好一些。使用压缩算法本质上是用 CPU 换取带宽在网络带宽有限的情况下非常有用

acks(重要)

建议:1 或 all

acks 参数控制了生产者在发送消息后需要收到多少确认才认为消息发送成功。

acks = 1 时,只要 Leader 副本确认接收到消息,生产者就会收到响应,这种方式在保证一定可靠性的同时,具有较高的吞吐量。

acks = all 时,生产者需要等待所有的 ISR(In-Sync Replicas)副本都确认接收到消息才会收到响应,这提供了最高的可靠性,但会略微降低吞吐量,因为需要等待更多的确认信息。在对消息可靠性要求极高的场景下,如金融交易数据的传输,建议使用 acks = all。

buffer.memory

默认:32MB
建议:32 ~ 64MB

buffer.memory用于暂存生产者未发送到 Broker 的消息。

当生产者发送消息的速度超过了 Broker 接收的速度时,消息会被存储在buffer.memory中。

如果缓冲区设置过小,可能会导致缓冲区很快被填满,从而使生产者阻塞,影响消息的发送效率。适当增大缓冲区大小可以避免因缓冲区满导致的阻塞问题,但也不能设置过大,否则会占用过多的系统内存资源。

max.in.flight.requests.per.connection(重要)

建议:1(性能差、顺序强一致)、n(高性能、但可能乱序)

max.in.flight.requests.per.connection限制了单个连接上允许的最大未确认请求数。生产者可以在一个连接上同时发送多个请求而无需等待每个请求的响应。

如果将该值设置得过高,可能会导致消息的顺序被破坏。例如:当一个请求失败并重试时,后续已经发送的请求可能会先到达 Broker,从而导致消息的顺序不一致。需要根据实际情况合理设置该值,以平衡吞吐量和消息顺序性。

message.max.bytes(重要)

建议:小于128KB

生产者能够发送的最大消息大小。

设置合适的 message.max.bytes 可以确保生产者发送的消息不会超出 Broker 和消费者的处理能力。如果设置得过大,可能会导致 Broker 和消费者的内存压力增大,处理效率降低;如果设置得过小,可能无法满足某些业务场景下大消息的传输需求。需要根据实际业务中的消息大小分布来合理调整该值。

2、消费者调优

fetch.min.bytes(重要)

建议:1MB - 10MB

消费者在单次拉取数据时,从 Broker 获得的最小数据量。

通过设置一个较大的值,可以减少消费者向 Broker 发送拉取请求的频率,因为只有当 Broker 上有足够的数据满足 fetch.min.bytes 的要求时,才会将数据返回给消费者。这样可以降低网络开销,提高整体的性能。但如果设置得过大,可能会导致消费者等待时间过长,影响实时性。

fetch.max.wait.ms(重要)

建议:500ms

消费者等待 fetch.min.bytes 数据量的超时时间。

当消费者向 Broker 发送拉取请求后,如果在 fetch.max.wait.ms 时间内,Broker 上的数据量仍然没有达到 fetch.min.bytes 的要求,Broker 也会将当前可用的数据返回给消费者。

该参数用于平衡延迟和吞吐量。设置得较短,消费者可能会频繁地拉取少量数据,增加网络开销;设置得较长,可能会导致消息处理的延迟增加。

max.poll.records(重要)

建议:500 - 5000

该参数限制了消费者单次拉取的最大消息数。合理设置该值可以避免消费者处理消息时出现阻塞的情况。

设置得过大,消费者可能会一次性拉取过多的消息,导致处理这些消息的时间过长,从而影响后续消息的拉取和处理;设置得过小,消费者需要频繁地向 Broker 发送拉取请求,增加了网络开销。需要根据消费者的处理能力和 Broker 的负载情况来调整该值。

auto.offset.reset(重要)

建议:earliest

该参数决定了在消费者没有有效的偏移量时(例如,新的消费者组或者偏移量已经过期),从何处开始消费消息。当设置为 latest 时,消费者将从最新的消息开始消费,即只消费后续产生的新消息;

当设置为 earliest 时,消费者将从分区的最早消息开始消费。在需要处理历史数据的场景中,可以选择 earliest;而在只关注最新数据的场景下,选择 latest 更为合适(会丢数据)。

session.timeout.ms

建议:10s - 30s

消费者会定期向协调者发送心跳信息,以表明自己处于活跃状态。如果在 session.timeout.ms 时间内,协调者没有收到消费者的心跳信息,就会认为该消费者已经失效,并将其从消费者组中剔除。

如果该值设置得过短,可能会因为网络抖动等原因导致消费者被误剔除;如果设置得过长,当消费者真正出现故障时,协调者不能及时发现并重新分配分区,会影响整个消费者组的性能。

heartbeat.interval.ms

建议:1/3 * session.timeout.ms

指定消费者向协调者发送心跳的时间间隔。

心跳机制用于维持消费者与协调者之间的连接,确保协调者知道消费者处于活跃状态。通常建议将其设置为 session.timeout.ms 的三分之一,这样可以在保证及时检测到消费者故障的同时,避免过于频繁的心跳请求增加网络开销。

3、Broker 调优

num.network.threads

建议:CPU 核心数 × 3

指定 Broker 用于处理网络请求的线程数。

在高并发场景下,大量的生产者和消费者会同时向 Broker 发送网络请求,如果处理网络请求的线程数不足,会导致请求处理不及时,影响系统的性能。

通过将该值设置为 CPU 核心数的 3 倍可以充分利用 CPU 资源,提高网络请求的处理能力。但具体的值还需要根据实际的并发情况和系统资源进行调整。

num.io.threads

建议:CPU 核心数 × 8

用于处理磁盘 I/O 的线程数。

Kafka 的消息存储依赖于磁盘 I/O,因此磁盘 I/O 的性能对系统的整体性能有很大影响。增加处理磁盘 I/O 的线程数可以提高磁盘 I/O 的并发能力,加快消息的读写速度。

但需要注意的是,该值需要根据磁盘的性能进行调整,如果磁盘的性能较差,过多的线程可能会导致磁盘竞争加剧,反而降低性能。

log.flush.interval.messages(重要)

建议:1(立即刷盘,性能差)、n (批量刷盘,性能好,会丢数据)

指定将消息刷写到磁盘之前,需要累积的消息数。

增大该值可以减少磁盘 I/O 次数,因为每次刷盘会将更多的消息一次性写入磁盘,从而提高磁盘的写入效率。但这也会牺牲部分持久性,因为如果在消息累积过程中 Broker 发生故障,可能会导致部分未刷盘的消息丢失。需要根据业务对数据持久性的要求来合理设置该值。

log.flush.interval.ms(重要)

建议:1000 - 5000ms

强制刷盘的时间间隔,与 log.flush.interval.messages 配合使用。

即使消息数量没有达到 log.flush.interval.messages 的要求,只要时间达到 log.flush.interval.ms,也会将当前的消息刷写到磁盘。通过设置合理的刷盘间隔,可以在保证一定磁盘 I/O 效率的同时,提高数据的持久性。

num.replica.fetchers

建议:2 - 4

指定 Broker 用于副本同步的线程数。

副本同步是 Kafka 保证数据可靠性的重要机制,增加副本同步线程数可以提升副本同步的速度,减少副本之间的延迟。但过多的线程可能会占用过多的系统资源,因此需要根据实际情况进行调整。

auto.create.topics.enable

建议:false

在生产环境中,建议禁用自动创建 Topic 的功能。

如果启用该功能,当生产者或消费者尝试访问一个不存在的 Topic 时,Kafka 会自动创建该 Topic。这可能会导致生产环境中产生大量不必要的 Topic,增加系统的管理成本和资源消耗。

为了避免这种情况的发生,应该手动创建所需的 Topic,并将 auto.create.topics.enable 设置为 false

unclean.leader.election.enable

建议:false

禁止非 ISR 副本成为 Leader 可以确保数据的一致性。

当 Leader 副本失效时,如果启用了 unclean.leader.election.enable,非 ISR 副本可能会被选举为新的 Leader。由于非 ISR 副本可能落后于其他副本,成为 Leader 后可能会导致数据丢失或不一致。为了保证数据的一致性,建议将该参数设置为 false

log.retention.hours

建议:72小时

该参数指定了 Kafka 消息在磁盘上的保留时间。

根据存储容量和业务需求,可以调整该值。如果存储容量充足,且业务需要长期保留数据,可以适当增大该值;如果存储容量有限,或者业务只需要短期的数据,可以减小该值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis怎么避免热点数据问题

使用 RedisTemplate 避免热点数据问题的解决方案、场景及示例: 1. 数据分片(Sharding) 场景:高频读写的计数器(如文章阅读量统计) ​原理​:将数据分散到多个子键,降低单个 Key 的压…

B站Michale_ee——ESP32_IDF SDK——FreeRTOS_8 消息缓冲区

Message Buffer(消息缓冲区)与Stream Buffer(流数据缓冲区)类似,但有2点不同: Message Buffer每次只接收1次完整的Message;Message Buffer接收缓冲区小于1条Message大小时,会接收不到数据&#…

【计算机网络网络层深度解析】从IP协议到路由优化

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心实验实现实验1:IPv6地址配置实验2:OSPF路由配置实验3:NAT转换验证 运行…

【Hive入门】Hive性能调优:小文件问题与动态分区合并策略详解

目录 引言 1 Hive小文件问题概述 1.1 什么是小文件问题 1.2 小文件产生的原因 2 Hive小文件合并机制 2.1 hive.merge.smallfiles参数详解 2.2 小文件合并流程 2.3 合并策略选择 3 动态分区与小文件问题 3.1 动态分区原理 3.2 动态分区合并策略 3.3 动态分区合并流程…

如何让Steam下载速度解除封印?!

平时一直没注意到家里的路由器在偷懒。最近成功榨干家里的带宽,把平时一直20mb/s左右下载速度的路由器一番改造后成功steam下载速度稳定85Mb/s。平时一直都只发挥了他的1/3不到,真是太可惜了。 硬件 首先检查硬件,就千兆路由器而言&#xf…

通信原理第七版与第六版的区别附pdf

介绍 我用夸克网盘分享了「通信原理 第7版》樊昌信」, 链接:https://pan.quark.cn/s/be7c5af4cdce 《通信原理(第7版)》是在第6版的基础上,为了适应当前通信技术发展和教学需求,并吸取了数十所院校教师的反…

【2025五一数学建模竞赛A题】 支路车流量推测问题|建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析&#xff0c…

Python爬虫实战:获取彼岸网高清素材图片

一、引言 在数字化时代,图片素材的需求持续增长。彼岸网提供了丰富的高质量图片资源,其中 4K 风景图片备受用户青睐。借助 Python 爬虫技术,可自动化地从彼岸网获取这些图片,为用户提供便捷的图片素材服务。然而,爬取过程中会遭遇登录验证、反爬机制等问题,需采用相应技…

深入理解 C++ 数据类型:从基础到高级应用

C 是一种强类型语言,这意味着每个变量都必须有明确的数据类型,以便编译器知道如何存储和操作数据。数据类型决定了变量的内存占用、取值范围以及可以执行的操作。理解 C 的数据类型是编写高效、安全代码的基础。本文将全面介绍 C 的数据类型,…

补题:K - Magic Tree (Gym - 105231K)

来源:问题 - K - Codeforceshttps://codeforces.com/gym/105231/problem/K 题目描述: 一、题目分析 本题给定一个2行m列的网格,从(1, 1)格子开始进行深度优先搜索,每个格子可到达至少一个边相邻的格子且不重复访问,…

【Prometheus-OracleDB Exporter安装配置指南,开机自启】

目录 1. 安装Oracle Instant Client1.1 解压安装包1.2 创建运行时链接 2. 环境配置2.1 设置环境变量2.2 验证配置 3. 安装Oracle DB Exporter3.1 创建工作目录3.2 解压安装包3.3 添加执行权限 4. 数据库监控配置4.1 创建监控用户(切换到Oracle所属用户) …

溯因推理思维——AI与思维模型【92】

一、定义 溯因推理思维模型是一种从结果出发,通过分析、推测和验证,寻找导致该结果的可能原因的思维方式。它试图在已知的现象或结果基础上,逆向追溯可能的原因,构建合理的解释框架,以理解事物的本质和内在机制。 二、由来 溯因推理的思想可以追溯到古希腊哲学家亚里士…

Git 基本操作(二)

目录 撤销修改操作 情况一 情况二 情况三 删除文件 升级git 撤销修改操作 在日常编码过程中,有些时候,我们可能写着写着发现目前的版本的代码越写越挫,越不符合标准,想让我们当前的文件去恢复到上一次提交的版本…

java使用CMU sphinx语音识别

java使用CMU sphinx语音识别 一、pom依赖1、依赖dependency2、配置仓库repository 二、下载中文资源包1、下载中文资源包(需要其他语言的选择对应的文件夹即可),中文选择Mandarin2、将下载后的文件放到项目中3、代码-识别wav语音文件4、代码-…

企业内训|智能驾驶与智能座舱技术——某汽车厂商

4月25日,东北某市,TsingtaoAI团队为某汽车厂商的智能驾驶业务和研发团队交付“智能驾驶与智能座舱技术”课程。本课程系统讲解智能汽车两大核心领域技术架构与实现路径。课程涵盖智能驾驶感知层(激光雷达/毫米波雷达/视觉融合)、决…

【数学建模国奖速成系列】优秀论文绘图复现代码(二)

文章目录 国奖论文绘图复现代码,可直接运行柱状图横向柱状图分组柱状图堆叠柱状图堆叠柱状图2三维柱状图完整复现代码 国奖论文绘图复现代码,可直接运行 数模比赛的绘图是非常重要得,这篇文章给大家分享我自己复现的国奖优秀论文的代码&…

GitLab CVE-2024-12444 安全漏洞解决方案

本文分享极狐GitLab 补丁版本 17.11.1, 17.10.5, 17.9.7 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任…

随机微分方程(SDE):股票价格模型、利率模型的构建

随机微分方程(SDE):股票价格模型、利率模型的构建 一、随机微分方程(SDE)基础:从确定性到随机性的扩展 1. 定义与一般形式 随机微分方程(SDE)是包含布朗运动(随机项&am…

【MCP Node.js SDK 全栈进阶指南】高级篇(1):MCP多服务器协作架构

随着业务规模的不断扩大和系统复杂度的提升,单一服务器架构往往无法满足高并发、高可用性和弹性扩展的需求。在MCP生态系统中,多服务器协作架构成为构建大规模应用的必然选择。本文将深入探讨MCP TypeScript-SDK在多服务器环境下的部署、协作和管理,以及如何构建高可用、高性…

git 修改用户名和邮箱

在 Git 中修改用户名和邮箱地址是常见的任务,这可以确保你的提交记录使用正确的身份信息。你可以通过简单的命令来完成这一操作。 全局配置 修改全局用户名 要修改全局的用户名,请执行以下命令: git config --global user.name "New…