问题描述
生产环境有一个Redis会偶尔发生连接失败的报错。报错的时间点,客户端IP并没有特别明显的规律。以下是客户端报错信息。过一会儿,报错会自动恢复。
CRedis.Client.RExceptions.ExcuteCommandException:Unable to Connect redis server: ---> CRedis.Third.Redis.RedisException: Unable to Connect redis server: CRedis.Third.Redis.RedisNativeClient.CreateConnectionError()
CRedis.Third.Redis.RedisNativeClient.SendExpectData(Byte[][]cmdWithBinaryArgs)
CRedis.Client.Entities.RedisServer.<>c__DisplayClassd`1.<Get>b__c(RedisClientclien)
CRedis.Client.Logic.ClientPool.ExcuteAction[T](Func`2 action,String methodName)
CRedis.Client.Logic.ClientPool.Excute[T](Func`2 action, StringmethodName)
从报错的信息来看,应该是连接不上Redis所致。Redis的版本是2.8.19。虽然版本有点老,但基本运行稳定。
线上环境只有这个集群有偶尔报错。这个集群的一个比较明显的特征是客户端服务器比较多,有上百台。
问题原因:
Jemalloc每次回收都会判断所有实际应该清理的chunck并对清理做count,这个操作对于高响应要求的系统是很奢侈的,所以我们考虑通过升级jemalloc的版本来优化purge的性能。
解决方案:
根据上面的分析,我们尝试通过升级jemalloc版本,实际操作为升级Redis版本来解决。将Redis的版本升级到4.0.9之后观察,线上客户端连接超时这个棘手的问题得到了解决。
详情请看
https://mp.weixin.qq.com/s/VvAFpLmwg0bJZrnLUIv18A