首页 > 数据库 > NoSQL > Redis db连接超时
问题描述:
现象是redis db访问出现超时。
问题分析:
网络流量出现瓶颈,访问变慢。
点击(此处)折叠或打开
主机的网卡流量也达到了瓶颈。
redis主机的某些实例内存也开始报警,超过90%。
停止中间件应用后,发现问题还是没有解决,网络流量依旧很高。
将redis db切换到备机后,系统恢复,网络流量下降。redis db从库的内存使用率很低。
发生问题时当时主库的内存最高是14g,但是从库的内存才1.9g。那主库的内存占用是从哪里来的呢?
根据网络同事的反馈,网络请求的大小大概也就几十个字节,但是输出的大小每次达到了几M。
Redis输出缓冲区可能占用大量的内存空间,这和oracle的pga内存非常类似,每个oracle会话会独立分配一个内存区域。那么继续看看本案例是否也是输出缓冲区内存占用过多。查看zabbix相关指标,发现client_longest_output_list的确有增加。应该是输出缓冲区占用内存较大,也就是有大量的数据
从Redis服务器向某些客户端输出。
查看当时的日志,有omem比较大的情况。
点击(此处)折叠或打开
后续从slowlog中也发现有返回数据较多的操作。
点击(此处)折叠或打开
一次获取9075多个元素。
点击(此处)折叠或打开
经过和开发一起分析,类似于Oracle中的数据倾斜,redis的某个分片上返回的数据很大,导致服务器向客户端发送数据的buffer的积压。后续开发将这些数据分批取出,并放到JVM中进行缓存。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25105315/viewspace-2132306/ ,如需转载,请注明出处,否则将追究法律责任。