本文主要是介绍记一次服务503排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
503 Service Unavailable 是一种HTTP 协议的服务器端错误状态代码,它表示服务器尚未处于可以接受请求的状态。 通常造成这种情况的原因是由于服务器停机维护或者已超载。
现象
2024-01-30 12:03:37,122 [XNIO-1 task-2] ERROR [io.undertow.request] LoggingExceptionHandler.java:80 - UT005023: Exception handling request to /xxx接口
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.lang.OutOfMemoryError: Java heap space
排查
从错误信息中可以知道是由于反序列化导致的堆内存溢出.
-
经过查询相关资料, 初步猜测是因为底层
spring-boot-starter-data-redis
版本为2.7.18
, 默认使用lettuce
作为redis
客户端, 而lettuce
使用netty
进行网络通讯, 如果没有对其制定堆外内存, 默认使用Xmx
值(服务设置的为-Xms512m
). 而该业务加载了全量的集团组织用户数据, 进而加重了OOM风险. -
该服务引用了一个
cache
组件, 该组件封装redisTemplate
时初始化了RedisCacheManager
, 这个是SpringBoot
提供的缓存管理器.RedisCacheManager
默认使用JdkSerializationRedisSerializer
对缓存进行序列化, 序列化后的数据空间占用很大. 且RedisCacheManager
会初始化所有缓存, 让本就不大的内存雪上加霜.
处理
- 优先重启服务保障可用.
- 考虑升级
lettuce
或者Springboot
版本 - 考虑更换
lettuce
为Jedis
- 调整堆外内存或者
-Xms
这篇关于记一次服务503排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!