kafka单条消息过大导致线上OOM

楼高11个月前技术文章669


1 线上问题

kafka生产者罢工,停止生产,生产者内存急剧升高,导致程序几次重启。

查看日志,发现Produce程序爆异常kafka.common.MessageSizeTooLargeException。

查看kafka配置,默认单条消息最大1M,当单条消息长度超过1M,就会出现发送到broker失败,

从而导致消息在producer的队列一直累积,直到Produce OOM。

2 修改步骤

修改kafka的broker配置:message.max.bytes(默认1000000B),单条消息最大长度。使用

kafka时,应预估单条消息的最大长度,不然会发送失败

修改kafka的broker配置:replica.fetch.max.bytes (默认1MB),broker可复制的消息的最大字

节数。应该比message.max.bytes大,否则broker会接收此消息,但无法将此消息复制出去,

从而造成数据丢失

修改消费者程序端配置:fetch.message.max.bytes (默认1MB) – 消费者能读取的最大消息。

应该≥message.max.bytes。若不调节该参数,会导致消费者无法消费到消息,且不会爆出异

常或警告,导致消息在broker累积,按需调整上三参数

3 是否参数调节得越大越好或者说,单条消息越大越好?

(1)性能

通过性能测试,kafka在消息为10K时吞吐量达到最大,更大消息降低吞吐量,在设计集群的

容量时,尤其要考虑。

(2)可用的内存和分区数

Brokers会为每个分区分配replica.fetch.max.bytes参数指定的内存空间,假设

replica.fetch.max.bytes=1M

且有1000个分区,则需近1G内存,确保分区数最大的消息不会超过服务器内存,否则OOM。

消费端的fetch.message.max.bytes指定最大消息需要的内存空间,同样,分区数最大需要内

存空间不能超过服务器内存。如果有大消息要传送,则在内存一定时,只能使用较少分区数

或使用更大内存的服务器

(3)GC

更大的消息会让GC更长(因为broker需分配更大的块),关注GC日志和服务器日志信息。

若长时间的GC导致kafka丢失了zk的会话,则需配置zookeeper.session.timeout.ms参数

为更大的超时时间


相关文章

压测实操--kafka-consumer压测方案

压测实操--kafka-consumer压测方案

环境信息:操作系统centos7.9,kafka版本为hdp集群中的2.0版本。Consumer相关参数使用Kafka自带的kafka-consumer-perf-test.sh脚本进行压测,该脚本参...

Spark on yarn 动态资源配置

Spark on yarn 动态资源配置

1、背景spark on yarn 的环境下,开源的spark 默认是关闭动态分配申请资源的。每次提交时,需要手动定义--num-executors 的数量。为了提交任务方便,需要开启动态分配资源sp...

win内存使用率过高但是资源监视器查看不到进程,排查思路

win内存使用率过高但是资源监视器查看不到进程,排查思路

问题现象:服务器:某云服务器 内存使用率持续打高,但是通过任务管理器查不到占用内存很高的进程排查步骤:1、通过任务管理器分析核查目标主机的内存使用趋势情况,近7天内存使用情况如下:通过任务管理器排查内...

Nginx性能优化

Nginx性能优化

       前言:Nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求。 以下的Nginx配置参数作为参考,具体需根据线上业务情况进行调整。一、worker进程work...

PG体系结构(三)

PG体系结构(三)

四、物理结构4.1 软件安装目录bin             //二进制可执行文件 include         //头文件目录 lib             //动态库文件 share ...

MySQL 组复制一致性保证

MySQL 组复制一致性保证

说明本篇文章介绍,MySQL 组复制作为一个分布式系统,如何保证事务一致性?1. 一致性级别MySQL 8.0.14 版本开始,提供组复制变量:group_replication_consistenc...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。