redis 高并发导致无法连接处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis 高并发导致无法连接处理相关的知识,希望对你有一定的参考价值。

今天ELK收集日志的时候,发现收集失败,查找各方面原因,最后在redis日志里面发现报错:

[2489] 02 Jun 10:43:42 # Error allocating resoures for the client


错误是无法为客户端分配资源,查看redis连接数:

# redis-cli info | grep connected        
connected_clients:5036
connected_slaves:0

客户端的连接竟然有达到5000多


查看客户端连接情况:

redis 127.0.0.1:6379> client list
addr=10.247.64.115:52834 fd=5 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=127.0.0.1:38484 fd=7 idle=0 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=blpop
addr=10.105.1.2:53125 fd=8 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.3:32639 fd=9 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.4:57134 fd=10 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.5:53126 fd=11 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.7:8887 fd=12 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush

每个字段含义如下:

addr:客户端的地址和端口
fd:套接字所使用的文件描述符
idle:以秒计算的空闲时长
flags:客户端 flag
db:该客户端正在使用的数据库 ID
sub:已订阅频道的数量
psub:已订阅模式的数量
multi:在事务中被执行的命令数量
qbuf:查询缓冲区的长度(字节为单位, 0 表示没有分配查询缓冲区)
qbuf-free:查询缓冲区剩余空间的长度(字节为单位, 0 表示没有剩余空间)
obl:输出缓冲区的长度(字节为单位, 0 表示没有分配输出缓冲区)
oll:输出列表包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)
omem:输出缓冲区和输出列表占用的内存总量
events:文件描述符事件
cmd:最近一次执行的命令

发现客户端的idle空闲时长太长,连接池维持了太多的连接,需要将不用的连接及时释放掉:

redis 127.0.0.1:6379> CONFIG SET timeout 30
OK


再次查看连接:

# redis-cli info | grep connected
connected_clients:1137
connected_slaves:0

连接数大量下降


查看连接的具体情况

redis 127.0.0.1:6379> client list
addr=127.0.0.1:38484 fd=7 idle=0 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=blpop
addr=10.105.1.150:39742 fd=269 idle=29 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.226:53291 fd=5 idle=31 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush

idle的时间已经限制在30秒了


本文出自 “深呼吸再出击” 博客,请务必保留此出处http://ckl893.blog.51cto.com/8827818/1785422

以上是关于redis 高并发导致无法连接处理的主要内容,如果未能解决你的问题,请参考以下文章

Nginx并发请求过高导致请求超时的问题

redis怎样解决高并发

如何解决redis高并发客户端频繁time out

Redis高并发和快速的原因

【golang】高并发下TCP常见问题解决方案

单进程单线程的Redis如何能够高并发