redis报错“max number of clients reached"

查看redis监控的时候看到redis的graph出现不正常的情况,截图如下:

如上面截图所展示的样子,可以看到redis 的客户端连接数很突兀的上升到10K,又突然下降到0.排除了监控本身的原因,很明显是因为redis本身出了问题。

进入redis服务器,连接上去

/usr/bin/redis-cli -p 6399 -h 127.0.0.1

>127.0.0.1:6399>> info

ERR max number of clients reached

无论执行命令,显示的都是上面的那个错误。这个时候唯一想到的就是redis的客户端已经达到了最大的连接数,无法创建连接了。即redis client可以打开的文件描述符不足

1.获取得到redis:6399这个服务的PID信息

netstat -tunlp | grep 6399

2.获取redis的能够打开的最大文件描述符

cat /proc/PID/limints

可以看上述截图中Max open file这行参数可以看得到进程能够打开的最大文件描述符

3.查看进程打开的文件描述符

方法一:ll /proc/6677/fd | wc -l

方法二:lsof | grep 6399 | wc -l

通过上述方法获取得到的值是10015和10007,可以看得到redis的文件描述符已经使用完毕了。

4.因为redis-cli连接上redis之后无论如何更改出现上面的报错,但是redis server因为是作为缓存使用,不能够随随便便的重启,所以只能在客户端想办法,只能主动让客户端断开连接。所以获取得到6399端口的连接信息:

netstat -tun | grep 6399 | awk ‘{print $5}‘ | awk -F‘:‘ ‘{print $1}‘ | sort | uniq -c

8 10.143.106.95

8 10.143.90.216

5433 10.207.169.67

4788 10.221.236.76

1 10.221.244.39

6 10.225.36.189

在上面的命令可以很明显的获取得到那个IP地址连接redis服务的连接很多

5.进入连接最多的服务器,获得连接redis的客户端信息

netstat -tun | grep 6399

lsof -i:Port

根据上面俩个命令可以获得客户端的应用服务信息

6.获取得到应用服务信息之后,我们和开发商量之后,只能重启才能让客户端主动断开连接。所以直接重启了应用服务。

7.更改redis配置信息。

重启客户端之后,redis的connect也减少了一部分,这个时候可以连接上redis了。

a)获取redis的状态信息

>127.0.0.1:6399>>info

b)获取redis本地配置文件信息,最大连接数,timeout,tcp-keepalive

>127.0.0.1:6399>> config *

>127.0.0.1:6399>> config get maxclients

"10000"

>127.0.0.1:6399>> config get timeout

0

>127.0.0.1:6399>> config get tcp-keepalive

0

c)从上面命令可以看得出,最大连接数是10000,timeout和tcp-keepalive并没有开启,但是又不能重启redis-server,所以只能在线修改配置信息。

>127.0.0.1:6399>> config set maxclients=100000

OK

>127.0.0.1:6399>> config set timeout = 300

OK

做完上面措施之后,客户端连接数也已经断开。

问题产生的原因:

1.zabbix监控获取得到的值为什么是0

zabbix server上面执行

zabbix_get -s 0.0.0.0 -k ‘redis[connect client,6399]‘

0

原因是因为在agent段redis脚本抓取info信息的时候,对于不是数字类型的数据替换成0,所以导致zabbix 监控获取得到的数值是0

2.为什么有这么多的连接

线上的架构是

client ->VIP->server  #VIP指的是负载均衡

客户端和服务的连接的中间是通过VIP进行转发的,他们直接的通信是TCP/IP四层的通信,在VIP上面本身自己是有做timeout设置的,默认20min ,它会主动的断开连接,但是却没有通知client和server端,导致client和server端并不清楚自己已经断开了连接。但是由于client的代码并没有设置主动断开连接,所以client会认为自己是一直连接的状态,等到下一次它发起请求的时候,VIP会告诉client连接已经断开,client会重新在创建一个新的连接;对于server端来说即redis它本身也没有开启timeout和tcp-keepalive的,所以server端也不会主动的断开连接,所以连接会越来越多,导致连接数完全被使用完。

时间: 2024-12-20 15:38:04

redis报错“max number of clients reached"的相关文章

【转】redis报错“max number of clients reached"

查看redis监控的时候看到redis的graph出现不正常的情况,截图如下: 如上面截图所展示的样子,可以看到redis 的客户端连接数很突兀的上升到10K,又突然下降到0.排除了监控本身的原因,很明显是因为redis本身出了问题. 进入redis服务器,连接上去 /usr/bin/redis-cli -p 6399 -h 127.0.0.1 >127.0.0.1:6399>> info ERR max number of clients reached 无论执行命令,显示的都是上面的

生产redis client 链接报:ERR max number of clients reached 含义: 达到最大客户端数错误

1.通过netstat 命令查看TCP又11822个连接  (netstat命令是一个监控TCP/IP网络的非常有用的工具) 2.默认redis最大的连接数10000 ,但是此时无法连接redis客户端3.因为redis无法重启,否则会导致大量的应用无法访问,解决办法停止连接数最多的服务器应用4.只能在线调整参数,进入redis客户端,修改最大连接数 5.并且调整timeout   (当一个redis-client一直没有请求发向server端,那么server端有权主动关闭这个连接,可以通过t

mac brew install redis 报错

mac brew install redis 报错 /usr/local/opt/php55/bin/phpize /usr/local/opt/php55/bin/phpize: line 61: /usr/local/Library/ENV/4.3/sed: No such file or directory /usr/local/opt/php55/bin/phpize: line 62: /usr/local/Library/ENV/4.3/sed: No such file or di

Redis报错“ OOM command not allowed when used memory > 'maxmemory' ”

生产环境上遇到这个问题,控制台不停打印 “OOM command not allowed when used memory > 'maxmemory' ”; 起初不知道是什么,经过一番搜索: 1.登陆redis客户端:./redis-cli -h IP -p port -a passwd 2.执行命令:redis>info memory 若配置文件中,最大内存的策略设置为 maxmemory-policy volatile-lru 此配置只是清楚设置过期时间的key值,然而本应用并没有设置过期

连接redis报错MISCONF Redis is configured to save RDB s

连接redis报错MISCONF Redis is configured to save RDB snapshots date: Mon Nov 11 16:11:24 CST 2019 笔者:张首富 程序报错如下 redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands t

python操作redis报错:redis.exceptions.DataError: ZADD allows either 'nx' or 'xx', not both解决方案

一.问题描述 sorted set操作执行:print(connect.zadd('grade', 'bob', 98, 'mike' ,100))时报错redis.exceptions.DataError: ZADD allows either 'nx' or 'xx', not both 二.出现该问题原因 上面的connect.zadd('key','value1','score1','value2','score2')写法是redis-py 3.0之前的版本 在redis-py 3.0版

启动redis报错:...‘vm-enabled no‘...

启动 redis 发现报错: [[email protected] ~]# service redis start Starting redis-server: *** FATAL CONFIG FILE ERROR *** Reading the configuration file, at line 375 >>> 'vm-enabled no' Bad directive or wrong number of arguments [FAILED] ===解决方法=== redis

解决sqoop报错Invalid number; item = ITEM_UNICODE

报错栈: java.sql.SQLException: Invalid number; item = ITEM_UNICODE at com.intersys.jdbc.SysList.getInt(SysList.java:1735) at com.intersys.jdbc.CacheResultSet.getInt(CacheResultSet.java:247) at org.apache.sqoop.lib.JdbcWritableBridge.readInteger(JdbcWrit

redis 报错 "CONFIG REWRITE failed: Permission denied"

无意中看到了redis的config rewrite这个命令.闲来无聊,所以打算自己做个实验.下面的文章是redis关于config rewrite的描述信息: CONFIG REWRITE 命令对启动 Redis 服务器时所指定的 redis.conf 文件进行改写: 因为 CONFIG SET 命令可以对服务器的当前配置进行修改, 而修改后的配置可能和 redis.conf 文件中所描述的配置不一样, CONFIG REWRITE 的作用就是通过尽可能少的修改, 将服务器当前所使用的配置记录