1、问题分析:redis
- TCP是可靠协议,断开是须要通过4次挥手,既然服务端的链接未释放,那十之八九是客户端没有发送断开请求;
- 即便客户端没有主动断开链接,可是这个链接实际上已经失效了,可是redis超时时间为比较长(业务为长链接故比较长)
2、临时解决网络
其状况紧急业务重要,第一步进行了迁移恢复服务,保留一个现场,进行排查问题.net
3、问题排查get
- 查看业务方链接池,链接数状态 :状态正常
- 查看服务端,链接数状态:链接数已上w,异常,致使cpu很高
问题来了,为何服务端链接数会这么高?io
- 服务端没有主动释放,按照业务方的数据显示,正常释放时候不会出现这种状态的(timeout=3600s)
- 怀疑网络丢包,当时ping确实出现丢包,一旦丢包,RedisServer就SB了,Client端私自把链接关闭了,然Server端殊不知道,因此链接一直保持
- 这位同窗跟我遇到的状态是同样的,你们能够看看这个详细分析过程,很给力http://www.yanmingming.net/?p=1609
4、结论请求
- 客户端与服务端之间的链接问题,可能存在客户端断开了链接服务端不知晓、服务端断开了链接客户端不知晓,为了解决这两个问题,须要作的就是服务端和客户端按期检查,客户端经过setTestWhileIdle(Boolean.True)、setTimeBetweenEvictionRunsMillis(xxx) 来按期检查方式死链;服务端经过设置超时时间来作到检查链接的问题
- 网络延迟多关注,一个使人头痛的问题。