能收获什么?
- 更加了解TCP协议
- Redis与客户端关闭连接的机制
- 基于Apache Common连接池的参数调优
- Linux网络抓包
情况简介
近期迁移了部分应用到K8s中,业务开发人员反馈说,会发现频繁出现 : redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
堆栈如下图:
发生这个问题的应用的环境如下:
- Java8
- Jedis 2.9.0
排查
由于开发人员说近期才出现这个情况,我们首先怀疑是不是K8s环境的问题,进行了一轮K8s的网络环境问题排查。
我们首先利用tcpdump在node节点和容器内进行抓包。
tcpdump -i <interfaceName> -C 100 -s0 -n -w node.pcap tcp
不出意外我们确实发现了大量由Redis服务器响应给客户端的RST(TCP Reset)包,连接重置。
至此我们还是怀疑是网络不稳定引起的。
我们搜索了TCP RST相关内容,可以看到RST一般由下列的几个情况引起