站酷网网址,省直部门门户网站建设,dede做网站地图,dw个人简历网页制作文章目录 现象排查解决 现象
我们信控平台使用Java语言开发#xff0c;Spring Cloud微服务架构#xff0c;采用容器化部署#xff0c;所有服务都部署在docker里面#xff0c;使用docker-compose进行管理#xff0c;使用portainer进行监控平台部署客户现场后#xff0c;一… 文章目录 现象排查解决 现象
我们信控平台使用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 clientIdconsumer-anonymous.021c2acd-7a68-41d4-816b-65eb9dd3e3e4-52, groupIdanonymous.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.bytes与heap optsKafka的heap opts设置指的是JVM堆内存的配置。在Kafka启动时可以使用参数配置。我是使用docker部署的所以在docker-compose配置文件里设置socket.request.max.bytes是指一个Kafka客户端发送给Kafka服务器的单个请求的最大字节数。如果客户端试图发送超过指定大小的请求则服务器将拒绝该请求并返回一个错误响应根据不同的场景和需求可以根据实际情况来调整这个参数的大小以保证在高负载情况下Kafka能够以最佳的性能响应大量的请求具体配置如下 # 消息服务kafka:image: confluentinc/cp-kafka:5.5.7container_name: kafkavolumes:- /etc/localtime:/etc/localtime- ./volumes/kafka-data:/var/lib/kafka/datadepends_on:- zookeeperenvironment:- KAFKA_BROKER_ID1- KAFKA_ZOOKEEPER_CONNECTzookeeper:2181- KAFKA_ADVERTISED_LISTENERSPLAINTEXT://kafka:9092- KAFKA_LISTENER_SECURITY_PROTOCOL_MAPPLAINTEXT:PLAINTEXT- KAFKA_INTER_BROKER_LISTENER_NAMEPLAINTEXT- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR1- KAFKA_ADVERTISED_HOST_NAMEkafka- KAFKA_NUM_NETWORK_THREADS32- KAFKA_NUM_IO_THREADS16- KAFKA_log_retention_hours1 # 保留1小时超出1小时自动清理- KAFKA_log_retention_bytes2147483648 # 保留2G超出自动清理- KAFKA_log_segment_bytes536870912 # 每个段 512M- KAFKA_socket_request_max_bytes1073741824 # socket最大消息 1G- KAFKA_HEAP_OPTS-Xms1g -Xmx5g # 最大内存 5Gnetworks:- signal-networkrestart: always