本文主要是介绍记一次服务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排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!