kafka消费报错卡死:内存溢出OutOfMemoryError: Java heap space

这篇具有很好参考价值的文章主要介绍了kafka消费报错卡死:内存溢出OutOfMemoryError: Java heap space。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

现象

  • 我们信控平台使用Java语言开发,Spring Cloud微服务架构,采用容器化部署,所有服务都部署在docker里面,使用docker-compose进行管理,使用portainer进行监控
  • 平台部署客户现场后,一切功能正常,客户已经使用三个月左右。最后一次更新时一个月前,代码版本也比较新
  • 客户需要测试一些我们平台的新功能,周六我们优化人员,开始测试特勤服务。测试时发现平台异常,路口信号灯态数据不再更新,也没有特勤车辆轨迹上报
  • 正常情况下,特勤设备会实时上报位置信息,信号灯也会实时上报路口灯态,当特勤车辆到达指定位置时,信号灯做出相应的放行
  • 路口实时灯态变动信息和特勤设备轨迹GPS信息,都是通过kafka,汇总到数据中心,再通过socket推送到网页前端,进行展示
  • 一开始怀疑是nginx问题,怀疑是服务重启时,nginx没重启导致的(参考这篇博客:socketio连接失败,nginx返回502 connect failed)
  • 重启了nginx服务,仍然不管用,排除这个问题

排查

  • 周一的时候,联系了现场优化人员。使用portainer服务监控工具,查看各个docker服务最新日志,没发现报错信息
  • 在平台里的特勤管理界面,按下键盘的F12键,查看socket.io请求,也没有报错,对应着查看nginx日志,也没有报错,都是200。再次尝试将nginx重启,果然还是不行
  • 怀疑数据中心datacenter服务问题,重启docker restart datacenter,问题没了,算是解决了
  • 于是让现场优化人员,帮忙拉取了该datacenter服务最近一周的日志。查看了最近一周的日志记录,前几天没有任何报错信息,直到周五(周六特勤测试发现问题的),在日志里第一次看到了ERROR信息,kafka报错,消费的时候的报错,连接被重置
  • 先是几个NIO的报错
09:42:44.572 ERROR --- [tLoopGroup-3-72] c.c.s.listener.DefaultExceptionListener  : Connection reset by peer
java.io.IOException: Connection reset by peer
at java.base/sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at java.base/sun.nio.ch.SocketDispatcher.read(Unknown Source)
at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
at java.base/sun.nio.ch.IOUtil.read(Unknown Source)
at java.base/sun.nio.ch.IOUtil.read(Unknown Source)
at java.base/sun.nio.ch.SocketChannelImpl.read(Unknown Source)
at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:258)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Unknown Source)
  • 第一次出现报错,是周五的09:42,后面有短时间连续出现4次以上报错。再之后就是晚上18:40,之后时不时报一下这个错误
  • 再后边到晚上20:25,还是kafka的报错,但是是一个新的报错信息:内存溢出java.lang.OutOfMemoryError: Java heap space,后边就是频繁的内存溢出了
2023-07-21 20:25:02.502 ERROR  --- [6b-65eb9dd3e3e4] o.a.k.c.c.internals.ConsumerCoordinator  : [Consumer clientId=consumer-anonymous.021c2acd-7a68-41d4-816b-65eb9dd3e3e4-52, groupId=anonymous.021c2acd-7a68-41d4-816b-65eb9dd3e3e4] Heartbeat thread failed due to unexpected error
java.lang.OutOfMemoryError: Java heap space
at java.base/java.nio.HeapByteBuffer.init(Unknown Source)
at java.base/java.nio.ByteBuffer.allocate(Unknown Source)
at org.apache.kafka.common.memory.MemoryPool$1.tryAllocate(MemoryPool.java:30)
at org.apache.kafka.common.network.NetworkReceive.readFrom(NetworkReceive.java:113)
at org.apache.kafka.common.network.KafkaChannel.receive(KafkaChannel.java:452)
at org.apache.kafka.common.network.KafkaChannel.read(KafkaChannel.java:402)
at org.apache.kafka.common.network.Selector.attemptRead(Selector.java:674)
at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:576)
at org.apache.kafka.common.network.Selector.poll(Selector.java:481)
at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:551)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:265)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.pollNoWakeup(ConsumerNetworkClient.java:306)
at org.apache.kafka.clients.consumer.internals.AbstractCoordinator$HeartbeatThread.run(AbstractCoordinator.java:1374)
  • 根据报错信息,去网上搜索了一堆,基本确认了问题,是kafka服务内存溢出,程序访问时kafka给出了这个返回信息
  • 查看了下我们的kafka的JVM配置,只使用了默认的1G内存,一开始只有信号机实时数据上报,1G内存是完全够用的
  • 现在有信号机设备数据、雷达设备数据、特勤设备数据一起上报时,内存不够用了,需要增加内存

解决

  • 主要改了2个配置,socket.request.max.bytesheap opts
  • Kafka的heap opts设置指的是JVM堆内存的配置。在Kafka启动时,可以使用参数配置。我是使用docker部署的,所以在docker-compose配置文件里设置
  • socket.request.max.bytes是指一个Kafka客户端发送给Kafka服务器的单个请求的最大字节数。如果客户端试图发送超过指定大小的请求,则服务器将拒绝该请求并返回一个错误响应
  • 根据不同的场景和需求,可以根据实际情况来调整这个参数的大小,以保证在高负载情况下,Kafka能够以最佳的性能响应大量的请求
  • 具体配置如下:
  # 消息服务
  kafka:
    image: confluentinc/cp-kafka:5.5.7
    container_name: kafka
    volumes:
      - /etc/localtime:/etc/localtime
      - ./volumes/kafka-data:/var/lib/kafka/data
    depends_on:
      - zookeeper
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT
      - KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
      - KAFKA_ADVERTISED_HOST_NAME=kafka
      - KAFKA_NUM_NETWORK_THREADS=32
      - KAFKA_NUM_IO_THREADS=16
      - KAFKA_log_retention_hours=1 # 保留1小时,超出1小时自动清理
      - KAFKA_log_retention_bytes=2147483648 # 保留2G,超出自动清理
      - KAFKA_log_segment_bytes=536870912   # 每个段 512M
      - KAFKA_socket_request_max_bytes=1073741824 # socket最大消息 1G
      - KAFKA_HEAP_OPTS=-Xms1g -Xmx5g # 最大内存 5G
    networks:
      - signal-network
    restart: always

文章来源地址https://www.toymoban.com/news/detail-617146.html

到了这里,关于kafka消费报错卡死:内存溢出OutOfMemoryError: Java heap space的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • es内存溢出启动报错java.lang.OutOfMemoryError: Java heap space

    问题: es容器自己停止,重启之后启动失败,报错如下: 原因: 容器中es由于数据量过大,超过了elasticsearch进程的最大内存量,elasticsearch 会将启动脚本中的JAVA_OPTS 选项传递给 JVM 来启动elasticsearch. 其中最重要的一个参数是 -Xmx ,此参数用于控制系统分配给elasticsearch 进程的

    2023年04月14日
    浏览(47)
  • Java中的内存泄露、内存溢出与栈溢出

    大家好,我是欧阳方超。本次就Java中几个相似而又不同的概念做一下介绍。内存泄漏、内存溢出和栈溢出都是与内存相关的问题,但它们之间有所不同。 我们经常会遇到内存泄漏、内存溢出和栈溢出等问题,这些问题都与内存的使用有关。 内存泄漏(memory leak)指的是程序

    2024年02月03日
    浏览(51)
  • 性能优化-内存泄漏、内存溢出、cpu占用高、死锁、栈溢出详解

    含义:内层泄露是程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费。(换言之,GC回收不了这些不再被使用的对象,这些对象的生命周期太长) 危害:当应用程序长时间连续运行时,会导致严重的性能下降;OOM;偶尔会耗尽连接对象;可

    2024年01月19日
    浏览(56)
  • Android之内存泄漏与内存溢出

    内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存

    2024年02月13日
    浏览(39)
  • 什么是内存溢出?什么是内存泄露?

    文章目录 一、什么是内存溢出?  二、什么是内存泄露? 三、如何避免内存溢出和内存泄露? 一、什么是内存溢出?         假设我们JVM中可用的内存空间只有 3M ,但是我们要创建一个 5M 的对象,那么新创建的对象就放不进去了。这个时候,我们就叫做内存溢出。就好

    2024年02月08日
    浏览(50)
  • 什么是内存溢出,什么是内存泄漏?

    提示:以下是本篇文章正文内容,下面案例可供参考 假设我们 JVM 中可用的内存空间只剩下 3M,但是我们要创建一个 5M 的对象,那么,新创建的对象就放不进去了。这个时候,我们就叫做内存溢出。就好比是一个容量只有 300ml 的水杯,我们硬要往里面倒500ml 的水,这时候,

    2024年02月12日
    浏览(28)
  • ubuntu扩大运行内存, 防止编译卡死

    首先查看交换分区大小 1、关闭交换空间 2、扩充交换空间大小,count=64就是64G = 1G x 64 3、设置权限 4、指定交换空间对应的设备文件  5、启用交换分区 6、查看/etc/fstab是否有/swapfile none swap sw 0 0  edit /etc/fstab (或者vim /etc/fstab) :  /swapfile none swap sw 0 0 7、  

    2024年02月08日
    浏览(28)
  • 内存溢出、内存泄露的概述及常见情形

    java doc 中对 Out Of Memory Error 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理,由于 GC(垃圾回收)一直在发展,所有一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾

    2024年01月21日
    浏览(38)
  • Java中的内存溢出与内存泄漏深度解析

    目录 引言 一. 内存溢出(Memory Overflow) 1.1 堆内存溢出 1.2 栈内存溢出 1.3 内存溢出的解决策略 1.3.1 优化对象的创建和销毁 1.3.2 调整堆内存大小 1.3.3  使用内存分析工具 1.3.4 避免创建过大的对象 1.3.5 定期清理不再使用的对象 二、 内存泄漏(Memory Leak) 2.1Java内存泄漏的典

    2024年02月19日
    浏览(47)
  • jvm里的内存溢出

    目录 堆溢出 虚拟机栈和本地方法栈溢出(栈溢出很少出现) 方法区和运行时常量池溢出  本机内存直接溢出(实际中很少出现、了解即可) 堆溢出:最常见的是大list,list里面有很多元 素 堆溢出该怎么解决 :         定位到导致内存溢出的对象         判断是否是

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包