Kafka入门实战教程(6):调优Kafka的实践
1 调优Kafka的目标
通常来说,任何系统调优的目标都是为了满足系统常见的非功能性需求,而性能则是众多非功能性需求中最重要的一个。
不同的系统对性能的侧重点不同,DB的话性能是响应时间,而对于Kafka等MQ来说,则意味着吞吐量和延时。
所谓吞吐量,也称TPS,它指的是Broker端进程或Client端应用程序每秒能处理的字节数或消息数,这个值越大越好。

所谓延时,和响应时间类似,它指的是从Producer端发送消息到Broker端持久化完成之间的时间间隔。这个指标也可以代表端到端的演示,即我们从Producer端发送消息到Broker端持久化再到Consumer端消费消息成功的总时间间隔。和TPS相反,这个值越小越好。
2 性能优化漏斗
在调优过程中,业界有一个所谓的优化漏斗的模型,我们可以在每一层进行对应的优化调整,层级越靠上,调优效果越明显。

(1)应用程序层
指优化Kafka客户端应用程序代码,比如:合理使用数据结构、缓存计算开销大的运算结果等。该层优化的效果最明显,也比较简单。
(2)框架层
指合理设置Kafka集群的各种参数。改源码不容易,改参数还是So Easy。
(3)JVM层
Kafka Broker是一个普通的JVM进程,对JVM的优化对Kafka Broker也是适用的。
(4)操作系统层
对操作系统的优化虽然重要,但是效果可能不如想象中那么好,且学习投入相对较大。
3 基础性调优
操作系统层
4个关键点:
(1)挂载文件系统时禁掉atime更新;
atime 的全称是 access time,记录的是文件最后被访问的时间。记录 atime 需要操作系统访问 inode 资源,而禁掉 atime 可以避免 inode 访问时间的写入操作,减少文件系统的写操作数。
mount -o noatime
(2)选择ext4或XFS文件系统;
尤其是 XFS 文件系统,它具有高性能、高伸缩性等特点,特别适用于生产服务器。
(3)swap空间的设置;
建议将 swappiness 设置成一个很小的值,比如 1~10 之间,以防止 Linux 的 OOM Killer 开启随意杀掉进程。此外,建议将vm.max_map_count设置为一个较大的值,避免在一个主题数超多的Broker机器上碰到 OutOfMemoryError:Map failed的严重错误。
vim /etc/sysctl.conf 增加 vm.swappiness=N 增加 vm.max_map_count=655360 执行 sysctl -p 让sysctl.conf的修改生效
(4)页缓存大小;
给Kafka预留的页缓存越大越好,最小值至少要容纳一个日志段的大小,也就是Broker端参数log.segment.bytes的值,该值默认为1GB。预留出一个日志段大小,至少能保证 Kafka 可以将整个日志段全部放入页缓存,这样,消费者程序在消费时能直接命中页缓存,从而避免昂贵的物理磁盘 I/O 操作。
JVM层
2个关键点:
(1)堆设置
建议将JVM堆大小设置为6~8GB,在众多实际生产环境中,这个大小已被证明是非常合适的。
(2)GC收集器
建议使用 G1 收集器,主要原因是方便省事,至少比 CMS 收集器的优化难度小得多。另外,一定要尽力避免 Full GC 的出现。如果 Kafka 环境中经常出现 Full GC,可以配置 JVM 参数 -XX:+PrintAdaptiveSizePolicy,来探查一下到底是谁导致的 Full GC。
框架层(Broker端)
最关键的一点:保持服务器端和客户端版本一致!因为,如果不保持一致,可能会导致Kafka丧失一些性能收益,比如Zero Copy零拷贝。
另外的关键点就是合理设置Broker端的参数,毕竟源码修改不易,改参数还是so easy的。这一部分,后面性能指标调优部分详细介绍。
应用层
3个关键点:
(1)不要频繁地创建Producer和Consumer对象实例;
构造这些对象的开销很大,能复用就复用。
(2)用完及时关闭;
这些对象底层会创建较多的物理资源,不及时关闭,可能会造成资源泄露。
(3)合理利用多线程改善性能;
4 性能指标调优
调优吞吐量
在实际环境中,用户似乎总是愿意用较小的延时增加的代价,去换取 TPS 的显著提升。毕竟,从 2ms 到 10ms 的延时增加通常是可以忍受的。事实上,Kafka Producer 就是采取了这样的设计思想。

这里重点说说 Broker 端参数 num.replica.fetchers ,它表示的是 Follower 副本用多少个线程来拉取消息,默认使用 1 个线程。
如果你的 Broker 端 CPU 资源很充足,不妨适当调大该参数值,加快 Follower 副本的同步速度。因为在实际生产环境中,配置了 acks=all 的 Producer 程序吞吐量被拖累的首要因素,就是副本同步性能。增加这个值后,你通常可以看到 Producer 端程序的吞吐量增加。
其他的,具体可以参考上一篇《吞吐量与消息可靠性的实践》。
调优延时
下面的表格展示了优化延时的一些参数设置:

可以看到,优化延时其实与消息的高可靠性传递是违背的。
这里重点说说在 Consumer 端的参数 fetch.min.bytes,它表示只要 Broker 端有能返回的数据(根据配置的bytes数决定)就立即令其返回给 Consumer,缩短 Consumer 消费延时。这里将其设置为1,表示只要Broker端积攒了1字节数据,就可以返回给Consumer端。但是,这个1字节实在是太小了,还是让Broker端一次性积攒多一点点再返回给Consumer吧。
5 总结
本文总结了Kafka调优的目的和方法论,并直接给出了调优Kafka的关键参数配置,可以直接用于生产环境。
参考资料
极客时间,胡夕《Kafka核心技术与实战》
B站,尚硅谷《Kafka 3.x入门到精通教程》

Kafka入门实战教程(6):调优Kafka的实践的更多相关文章
- Kafka入门实战教程(7):Kafka Streams
1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...
- 《Apache Kafka实战》读书笔记-调优Kafka集群
<Apache Kafka实战>读书笔记-调优Kafka集群 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.确定调优目标 1>.常见的非功能性要求 一.性能( ...
- 转 Kafka入门经典教程
Kafka入门经典教程 http://www.aboutyun.com/thread-12882-1-1.html 问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic. ...
- Kafka性能调优 - Kafka优化的方法
今天,我们将讨论Kafka Performance Tuning.在本文“Kafka性能调优”中,我们将描述在设置集群配置时需要注意的配置.此外,我们将讨论Tuning Kafka Producers ...
- [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出
在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...
- [JVM教程与调优] 什么是JVM运行时参数?
我们接着上一章节[JVM教程与调优] JVM都有哪些参数类型?的内容继续讲解,这章我们来介绍一下:如何查看JVM运行时参数.这一点十分重要,因为我们在进行JVM参数调优的时候,我们首先得知道目前系统运 ...
- MySQL面试必考知识点:揭秘亿级高并发数据库调优与最佳实践法则
做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 今天我们用10分钟 ...
- 【原创 Hadoop&Spark 动手实践 8】Spark 应用经验、调优与动手实践
[原创 Hadoop&Spark 动手实践 7]Spark 应用经验.调优与动手实践 目标: 1. 了解Spark 应用经验与调优的理论与方法,如果遇到Spark调优的事情,有理论思考框架. ...
- [转]10分钟梳理MySQL知识点:揭秘亿级高并发数据库调优与最佳实践法则
转:https://mp.weixin.qq.com/s/RYIiHAHHStIMftQT6lQSgA 做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离 ...
- Windbg调优Kafka.Client内存泄露
从来没写过Blog,想想也是,工作十多年了,搞过N多的架构.技术,不与大家分享实在是可惜了.另外,从传统地ERP行业转到互联网,也遇到了很所前所未有的问题,原来知道有一些坑,但是不知道坑太多太深.借着 ...
随机推荐
- 【Maven】在 Idea 中使用 Maven
在 Idea 中使用 Maven 1 在 Idea 中配置 Maven Idea 中也自带 Maven 插件,而且我们也可以给自带的 Maven 插件进行配置,所以我们可以使用自带的 Maven,也可 ...
- ASP.NET Core 项目归档
把一些基于 ASP.NET Core 的实用项目找个地方记录下... 项目列表: IdentityServer
- java基础之线程池
一.线程池:提前创建多个线程存放到集合容器中,其中的线程可以反复使用,减少资源的开销 作用就是:线程执行完一个任务,并不被销毁,而是可以继续执行其他的任务 使用线程池中线程对象的步骤: 1. 创建线程 ...
- MySQL之profiling性能优化
如果需要优化一条SQL,想了解一条sql的每个阶段的耗时分布,则可以使用profiling来进行分析,能很方便的定位在哪个阶段.什么资源引起的性能问题. 一.开启profiling参数 此参数默认是关 ...
- MVVM绑定 填坑,必须在与 DependencyObject 相同的线程上创建 DependencySource
场景:线程里面构建MVVM实体类,实体类包含 Brush 属性时,构建 SolidColorBrush 需要UI线程,否则会报 "必须在与 DependencyObject 相同的线程上创建 ...
- 勒索病毒分析-2024wdb-re2
检查相关信息 可以看到病毒存在VMProtect虚拟壳 简单脱壳 首先我在x64debug中运行一次,发现没有中断退出,证明大概率没有反调试,但是有crc检测,所以尽量不下int3断点(脱壳时). 一 ...
- Spring Boot 不能加载 tcnative-2.dll 库(Can't load library: tcnative-2.dll)
Spring Boot 不能加载 tcnative-2.dll 库 本文将介绍怎样解决 Spring Boot 在启动时抛出 "org.apache.tomcat.jni.LibraryNo ...
- MCP SSE交互完整过程
有关MCP的介绍文章很多,本文不细说,做一个时序图将完整过程说清楚.MCP协议主要通过两种技术实现:标准输入输出(stdio)和服务器发送事件(SSE),stdio(标准输入输出)是MCP协议在本地或 ...
- C#8.0,9.0,10.0常见新语法学习
顶级语句 (1)一个项目最多只能有一个文件具有顶级语句,就是直接写代码,如果存在多个,则会报错, (2)如果顶级语句和Main共存,则只调用顶级语句 (3)如果没有顶级语句,则必须有Main 简化us ...
- JavaScript环境搭建与调试
JavaScript的环境搭建非常简单,一个Chrome浏览器(实际上任何浏览器都自带有JavaScript解释器,Chrome对调试更友好,下载链接:http://www.51xiazai.cn/s ...