当前位置: 首页 > news >正文

从零学习Kafka:调优

迟通常是指消息从 Producer 端生产到 Consumer 端成功消费的总时长。这个值我们希望的越短越好,我就是低延迟。

可靠性从两个方面理解,一是集群整体的稳定性,也就是集群会不会出现不可用的情况,这点毋庸置疑,我们一定是希望稳定性越高越好的。另一方面是消息传输的稳定性,也就是会不会丢消息,在某些场景下,我们可能会舍弃一部分消息传输的可靠性来换取高性能。

调优分层

明确了目标之后,我们把调优的方法按照层级进行划分。

我们分为 4 层,总的来说,越靠上的层级调优效果越好。

  • 应用程序层:指的是我们客户端的代码,即消息的生产和消费逻辑。这些逻辑的优化效果是非常可观的,通常也比较简单。

  • 框架层:在这一层我们通常会调整 Kafka 的各种参数,相对也比较简单。

  • JVM 层:指的是 Broker 端的 JVM 调优,针对 JVM 的调优也能收获不错的效果。

  • 操作系统层:通常就是 Broker 端部署的操作系统环境的优化。

接下来我们就看一下这 4 个层面分别可以做哪些优化。

应用程序层

我们先来看应用程序层,这部分优化可以认为是最简单,也是最有效的。但由于每个业务甚至每个开发者写出来的逻辑都不一样,对应的优化方法也不一样。因此我无法给出一个“银弹”。不过有一些最基本的准则需要遵循。

  1. 不要频繁创建 Producer 和 Consumer 实例。

  2. 用完及时关闭,Producer 和 Consumer 对象底层会使用很多物理资源,不及时关闭的话可能会造成资源泄漏。

  3. 合理使用多线程提升性能。

框架层

框架层可做的调优比较多,最基本的就是保持客户端与 Broker 端的版本一致。相同版本的客户端和 Broker 端之间通信可以享受 Zero Copy 的性能收益。

接着我们再分别看一下 Producer、Broker 和 Consumer 三部分还有哪些调优操作。

Producer

首先是生产者,它的瓶颈通常在于 CPU 或网络 IO。调优主要从批量发送、压缩算法和确认机制这三方面入手。

批量发送

批量发送是调优吞吐量的关键,主要是调整batch.sizelinger.ms这两个参数。其实在前面的文章中我们也有提到过。

如果想要高吞吐,可以适当调大这两个参数的值。例如batch.size可以从默认的 16KB 调大到 512KB 或者 1MB,linger.ms可以调整到 10 到 100 毫秒。

如果想要低延迟,我们可以调小这两个参数,最极端的方式是linger.ms设置为 0,也就是数据不在 Producer 端停留,直接发出去。

压缩算法

压缩可以节省网络 IO,但会消耗 CPU 资源。这部分在从零学习Kafka:生产者压缩一文中有详细的介绍。

如果需要高吞吐,推荐使用 lz4 或 zstd 算法。

如果需要低延迟,就不要开启压缩。

确认机制

主要调整acks参数。这是性能与可靠性的平衡。

想要高性能,可以设置acks=1,即 Leader 收到后就返回。

想要高可靠,可以设置acks=all,确保所有副本都同步到消息。

Broker

再来看 Broker 端的调整。

首先是num.replica.fetchers参数,它用来控制 Follwer 副本用多少个线程来拉取消息。不论是高吞吐还是低延迟的场景,最好都把这个参数调大一点,但不要超过 CPU 核数。

然后是内存层面,Kafka 强依赖操作系统的页缓存,因此不要给 Broker 配置太大的 JVM 堆内存,通常配置 6 到 10 GB 足够用,剩下的留给页缓存。

接着到磁盘层面,log.dirs可以配置多个磁盘路径,Kafka 会在这些路径间分布分区,这样可以有效利用多块磁盘的并非 IO 来提升性能。

最后到网络层面,num.network.threads参数用来指定接收请求的线程数,num.io.threads参数用来指定处理磁盘请求的线程数,这两个参数都可以适当调大。

Consumer

最后我们来看消费者端的调优。消费者端有两个核心参数:fetch.min.bytesfetch.max.wait.msfetch.min.bytes代表单次抓取的最小数据量,fetch.max.wait.ms代表如果数据量不够,最长的等待时长。

如果是高吞吐场景,可以调大这两个参数。相反,如果是低延迟场景,可以调小这两个参数。

我们通过一个表格来小结一下。

场景核心参数适用业务
高吞吐调大batch.sizelinger.ms,压缩算法使用 lz4 或 zstd日志收集类场景
低延迟linger.ms设置为 0,acks设置为 1实时监控告警
高可靠acks=allmin.insync.replicas至少是 2金融支付等场景

至此,框架层的调优方法就介绍完了,我们继续顺着漏斗往下看。

JVM 层

Kafka 的 JVM 层的调优和其他服务的 JVM 调优没什么区别。除了我们刚刚提到的不要设置太大的堆内存之外,就是要选择合适的垃圾回收器,最好使用 G1 和 ZGC 这样更先进的垃圾回收器,不光性能更好,调优方法也会简单很多。

操作系统层

操作系统层的调优可能大部分同学不会接触到,这里我们简单介绍几个方法。

第一是在挂载文件系统时执行下面的命令禁用掉 atime 更新,这一调整可以减少文件系统的写操作数。

mount -o noatime

第二是选择合适的文件系统,可以是 ext4 或 XFS。当然如果有性能和可靠性更好的文件系统也可以尝试。

总结

最后我们来总结一下本文的内容,我们首先明确了 Kafka 调优的目标,即在高吞吐、低延迟、高可靠三点中找到平衡。接着对调优

http://www.jsqmd.com/news/1132473/

相关文章:

  • # TDengine TMQ 最佳实践 — 可靠消费、容错与监控
  • Node.js-Phase 1 学习总结:CLI 文件管理系统
  • 3分钟极速指南:用Python工具一键获取国家中小学智慧教育平台电子课本
  • 一个独立开发者的审计日志平台
  • Linux 系统中定位与设置 JAVA_HOME 目录
  • MNIST 数据集 3 种主流框架加载对比:PyTorch vs TensorFlow vs Hugging Face Datasets
  • Educator头歌答案分享:数据预处理与特征工程在线实验闯关
  • Pot Desktop:5大核心功能解密,3分钟掌握跨平台翻译神器
  • Java面试突击指南!1个月拿下Java高级开发岗!AI大模型简历必备/面试必备!
  • Agentic RAG 方案深度解析:从概念到落地
  • 如何在Linux上流畅运行Windows游戏:DXVK终极配置指南
  • Fastboot Enhance:Windows平台一站式Android刷机工具箱,告别命令行复杂操作
  • Markdown锚点跳转失败的解决办法
  • Jetson Nano Super + Ubuntu 22.04 + ROS2 Humble:MID-360、FAST-LIO 与 EGO-Planner 实时建图部署记录
  • pytest-xdist分布式测试:加速APP自动化测试的架构与实战
  • 互联网大厂 Java 面试实录:谢飞机的三轮攻防战
  • 前后端分离爱心商城系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 从零搭建一个单节点 K8S 可观测实验室(一):从 Ubuntu 24.04 开始
  • HarmonyOS 小游戏《对战五子棋》开发第3篇-项目配置文件全解析
  • AI 已经改变工作方式,我们该怎么适应这场变化?
  • Codex 使用 Playwright Test Agents
  • 换种不同的方式调用WCF服务[提供源代码下载]
  • 3步解锁中医AI:如何让“仲景“大语言模型成为你的智能中医助手
  • 程序员的语言“艳遇史”(四) ——数学系师姐forth
  • 尽量减少对DOM的操作
  • mnist-数据集的学习-3.6手写数字识别
  • Tableau新手实战指南:3天做出可交付业务看板
  • 【学习记录】Week14(一):信息泄露系统化方法论与 ORW 基础体系构建
  • 用虚拟机实际体验Google Chromium OS (Chrome OS) Pre-Built
  • FastAPI 新手入门第 8 篇:让 /docs 更像一份 API 文档