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行业转到互联网,也遇到了很所前所未有的问题,原来知道有一些坑,但是不知道坑太多太深.借着 ...
随机推荐
- 【Win32】通过多线程自动关闭对话框的方法
零.需求 希望在Windows开机后自动弹出个对话框提示一下,过8秒后自动关闭 一.解决 1.建项目和源文件 在VC6.0中新建Win32项目 新建C++源文件 2.编写代码 基础结构 #includ ...
- fastreport6的frxpngimage.pas不能编译xe下
升级很痛苦,因为兼容问题. fastreport6的frxpngimage.pas不能编译出现错误 procedure TChunkIDAT.CopyInterlacedRGB8(const Pass ...
- ZKmall模版商城前后端分离秒级响应架构深度解析
在当今的电商领域,用户体验和响应速度已成为决定平台竞争力的关键因素.ZKmall模版商城,作为一款高性能的电商平台解决方案,通过采用前后端分离架构,实现了秒级响应,为用户带来了极致的购物体验.本文将深 ...
- vscode安装离线插件autopep8
商店 从上面的链接进去,在visual studio code一栏开始搜索,我要的是autopep8,所以搜索得到的是这样的: 点进去后,是这个界面,然后我是离线下载,要的是拓展包,所以是下面操作 下 ...
- 目前国内可用Docker镜像源汇总(截至2024年11月)
本文主要讲述了由于特殊原因国内的 Docker 镜像源出现问题,国内许多常见的镜像源如网易.百度等已不可用.文中介绍了中科大镜像源的暂时关闭情况,以及阿里镜像源包括私人阿里镜像加速器的使用方式,并提供 ...
- arthas安装和简单使用
介绍 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load.内存.gc.线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参.异常,监测方法执 ...
- MySQL隐藏手机号
1.实现方法 通过MySQL的left.right.contact函数实现 2.语法说明 contact()函数 作用:将多个字符串连接成一个字符串 语法:concat(字符串1,....,字符串n) ...
- Cobalt Strike基础
Cobalt Strike基础 Staged(有阶段) 在有阶段的执行方式中,分为Stager和Stage两个阶段 Stager(初始执行载荷): 定义:Stager是Stage 1,是一个较小的 ...
- 【docker】4种网络模式
bridge模式 使用--net=bridge指定,Docker的默认设置,这种模式创建出来的docker容器链接到Dcoker网桥上(docker0网桥或者其它自定义的网桥): 1)创建一对虚拟网卡 ...
- 基于Zabbix Low-level discovery 方式 网络质量监控配置手册