优化金字塔

应用程序层面

框架层面(Broker层面)

JVM层面

操作系统层面

应用程序层面:应当优化业务代码合理使用kafka,合理规划主题,合理规划分区,合理设计数据结构;

框架层面:在不改动源码的情况下,从kafka参数配置入手,结合业务体量和运行数据进行调优

JVM层面:在出现明显缓慢和可能的内存溢出的情况下,结合业务代码情况和服务器能力调优堆内存,非堆内存,GC方式等参数,非必要不更改过多参数

操作系统层面:在服务器操作系统层面调优尽量减少kafka程序运行限制,关注文件描述符限制,Selinux限制,JDK版本等情况

操作系统调优

文件系统的选择上,可选择XFS和EXT4,生产环境推荐XFS,具备高性能和高伸缩性优点,最新的报道显示具备多级缓存的ZFS针对高IO的kafka有不错的效果,但并未大规模验证

Swap空间参数设置:尽量设置小一点,修改/etc/sysctl.conf文件,增加vm.swappiness=,防止Linux OOM Killer线程随意杀线程

文件描述符:ulimit -n不能设置过小,在topic数量稍大时就会出现Too Many File Open报错情况

控制进程可以拥有的内存映射区域的最大数量:vm.max_map_count,设置过小会出现内存溢出情况

操作系统页缓存:由于Kafka存储数据时只要数据到来Page Cache页缓存就会返回Ack给生产者,并不会直接落盘,还需要等待触发或手动刷盘操作进行持久化刷盘,此时操作系统的Cached大小必须超过一个日志段大小,Broker上对应参数为log.segment.bytes,越大消费者在消费时有更大概率在缓存页命中,避免频繁IO从硬盘读取数据。

JVM层面调优

(1)堆内存参数设置:kafka本身并不占用过多堆内存,6-8G相对合适,在kafka-server-start.sh设置KAFKA_HEAP_OPTS参数即可;更精确可以查看KafkaServer-gc.log,关注Full GC之后堆上存活大小的总量,从而可以将堆内存设置为这个值的2-2.5倍,可以使用图上命令进行手动GC

(2)GC选择器:博主kafka3.5.1版本的kafka集群使用openjdk11.0.X,默认G1收集器;在G1中Full GC是单线程运行,在生产环境中要尽量避免Full GC

(3)JDK选择:至少JDK1.8,推荐JDK11,kafka3.0推荐至少使用JDK11

框架调优(Broker层面)

(1)版本适配:尽量保持客户端版本和Broker端版本一致或尽量适配,以避免版本之间不一致问题导致的性能优化损失,如零拷贝等特性

(2)消息压缩方式:Broker端和Producer段的消息压缩方式应该保持一致,推荐lz4,第二选择gzip,如果设置得不一致会导致Broker付出大量额外的CPU性能用于解压和二次压缩

(3)num.io.thread:Handler线程用于执行业务处理,Acceptor线程用于接收网络请求,Processor线程用于建立网络连接和分发网络请求,Handler线程才是执行业务请求处理的线程,由Broker参数num.io.thread决定,数量越大执行线程越多,处理速度更快

(4)num.recovery.threads.per.data.dir:Broker重启后恢复线程数量,设置越大,追上数据进入ISR越快

(5)num.network.thread:The number of threads that the server uses for receiving requests from the network and sending responses to the network,增加这个线程参数就是提高收发网络请求的速度

(6)log.retention.bytes:日志保存时间,针对业务需求合理设置时间

(7)message.max.bytes:针对消息集合打包的大消息体业务,需要设置更大的参数

(8)num.replica.fetchers:副本数据同步线程,应当不超过cpu核数,通常设置为4-8即可

框架调优(Producer层面)

(1)消息发送确认机制:acks=all,通常情况下在生产环境设置为acks=1即Leader副本确认即可

(2)批量发送消息大小:batch.size= 发送到同一个分区消息的批次大小限制

(3)发送最大时延:linger.ms=,批量大小没有达到batch.size,最大允许时延

框架调优(Consumer层面)

(1)消息提交机制:如为保证消息不重复消费即手动提交消息

(2)消息数据批量大小:fetch.min.bytes,如果时延不敏感追求吞吐量,可设置得大一点

应用程序层面调优

(1)保证业务代码健壮性,保证容器不会出现过多bug导致反复重启诱发Kafka集群Rebalance
(2)不要频繁创建Producer和Consumer,建立的连接要Close;
(3)合理创建线程池进行连接复用
(4)合理利用多线程进行推送,消费消息

Kafka多维度调优的更多相关文章

  1. DataPipeline |ApacheKafka实战作者胡夕:Apache Kafka监控与调优

    https://baijiahao.baidu.com/s?id=1610644333184173190&wfr=spider&for=pc DataPipeline |ApacheK ...

  2. Kafka的参数调优

    这篇文章主要说一下在生产过程中的kafka常用的调优参数, 首先kafka的版本是0.9.0.1,针对以下几个方面来说, 针对kafka的堆内存: 针对kafka的集群调优: kafka的的消息机制有 ...

  3. DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优

    胡夕 <Apache Kafka实战>作者,北航计算机硕士毕业,现任某互金公司计算平台总监,曾就职于IBM.搜狗.微博等公司.国内活跃的Kafka代码贡献者. 前言 虽然目前Apache ...

  4. Kafka监控与调优

    Kafka监控 五个维度来监控Kafka 监控Kafka集群所在的主机 监控Kafka broker JVM的表现 监控Kafka Broker的性能 监控Kafka客户端的性能.这里的所指的是广义的 ...

  5. Spark踩坑记:Spark Streaming+kafka应用及调优

    前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从k ...

  6. Kafka 集群调优

    更多内容,前往 IT-BLOG 单个 kafka服务器足以满足本地开发或 POC要求,使用集群的最大好处是可以跨服务器进行负载均衡,再则就是可以使用复制功能来避免因单点故障造成的数据丢失.在维护 Ka ...

  7. kafka消费服务调优

    1.消费服务速度跟不上 2.top -H 观察是哪个线程最忙 3.多次使用jstack,看看最忙的那个线程在做什么

  8. 我的 Kafka 旅程 - 性能调优

    Producer 于 config/producer.properties 配置文件中的项 # 序列化数据压缩方式 [none/gzip/snappy/lz4/zstd] compression.ty ...

  9. 《Kafka权威指南》读书笔记-操作系统调优篇

    <Kafka权威指南>读书笔记-操作系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大部分Linux发行版默认的内核调优参数配置已经能够满足大多数应用程序的运 ...

  10. 《Apache Kafka实战》读书笔记-调优Kafka集群

    <Apache Kafka实战>读书笔记-调优Kafka集群 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.确定调优目标 1>.常见的非功能性要求 一.性能( ...

随机推荐

  1. 菜鸟 CPaaS 平台微服务治理实践

    简介: 在使用 MSE 的云产品之后,对 PaaS 平台层来说,避免很多重复功能的建设.在我们业务侧实际落地的远不止如上列举的场景,比如:服务优雅停机.注册中心等能力,均解决了业务侧的微服务治理上的难 ...

  2. Java 应用压测性能问题定位经验分享

    简介: 问题千千万,但只要修练了足够深厚的内功,形成一套属于自己的排查问题思路和打法,再加上一套支撑问题排查的工具,凭借已有的经验还有偶发到来的那一丝丝灵感,相信所有的问题都会迎刃而解. 作者:凡勇 ...

  3. Paillier半同态加密:原理、高效实现方法和应用

    ​简介: <数据安全法>已于9月1日起正式实施,两个月后<个人信息保护法>也将开始施行,意味着数据安全和隐私保护方面的监管将会在年内陆续到位.在合规收紧大背景下,"数 ...

  4. vue中使用vue-b2wordcloud创建词云

    安装使用 安装:使用npm install vue-b2wordcloud --save或者直接在vue ui中添加vue-b2wordcloud运行依赖 使用:在main.js中导入使用 impor ...

  5. k8s控制节点etcd删除并重新加入

    官方参考:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/ 1.删除etcd节点 cd ...

  6. RT-Thead移植时缺少SystemCoreClockUpdate函数

    一.问题 在移植 RT-Thead 时,需要获取mcu当前的 HCLK 时钟频率来设置滴答时钟,而我使用的库函数中刚好缺少SystemCoreClockUpdate函数. 我之前在RT-Thread移 ...

  7. html+jq实现全国省的单选,弹框输入input

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  8. Js使用面向对象和面向过程的方法实现拖拽物体的效果

    1.面向过程的拖拽实现代码: <!DOCTYPE html> <html> <head> <title>drag Div</title> & ...

  9. P3622 [APIO2007] 动物园 -题解

    好写 爱写 没事干 所以有了这篇题解 洛谷P3622 [APIO2007] 动物园 题解 $Link$ hzoi题库 洛谷 题目说的挺繁琐,其实就传达了一个很简单的信息: \(n\)个动物,\(c\) ...

  10. springboot项目启动会报4个加载不到的debug提示,可改可不改

    1. 因为启动的时候会报提示: Unable to locate LocaleResolver with name 'localeResolver': using default [org.sprin ...