事情呢,是这样的。早上突然看到反馈说redis连接异常,就是这个:max number of clients reached。问题很显然就是redis连接数超了,设置一下最大连接数就好了。
1.登录redis服务器,查看下最大连接数
CONFIG GET maxclients
2. 看下当前连接数
INFO clients
这里的3877是由于停了一小部分程序,减少了redis连接,否则命令行登录时也会显示连接超过最大值
3.既然这个数目不够,那就加呗
CONFIG set maxclients 8000
你以为这样就可以了?对,我也是这么以为的。然而。。。出现了这个:(error) ERR The operating system is not able to handle the specified number of clients, try with 4064
一通百度+google下来,似乎都说要重启服务设置参数启动,线上重启有点过分了。虽然没能从正面解决问题,但还是给了一些思路。
4.查看系统相关设置
ulimit -a
这里其实阿里云服务器系统参数默认已经做了优化
5.看一下当前redis进程的进程号
ps -ef | grep redis
得到进程号为28888
6.至此,我们可以来看一下当前redis进程的相关参数配置描述
cat /proc/28888/limits
上图中Max open files 4096 4096 files 值得引起关注,这个应该就是解决问题的关键
所以有没有办法去动态 改变这个值呢?
7.修改正在运行的进程limits限制
sudo echo -n 'Max open files=10000:10000' > /proc/28888/limits
-bash: /proc/20822/limits: Permission denied
???啥情况?不能修改??? 兄dei莫慌,切换到root就可以为所欲为(滑稽)
切换到root后:
echo -n 'Max open files=10000:10000' > /proc/28888/limits
bash: echo: write error: Invalid argument (如果出现了这个,可能是系统内核版本高了,请使用下面一句)
prlimit --nofile=10000:10000 --pid 28888
8.再瞄一眼redis进程的相关信息
cat /proc/28888/limits
诶呦~ 不错哦~ 改过来了,目测离成功不远了
9.设置更大的redis client连接数吧,后浪
CONFIG SET maxclients 9600
到这里这个问题基本上算是解决了,这也算是当年由于经验不足给自己挖的坑,幸好爬出来了。生产上的配置在初始的时候其实可以避免出现这种问题,不过既然来了,这句话就是多余。。。
参考文章:
https://blog.csdn.net/tengxing007/article/details/88354218
https://ask.csdn.net/questions/253239?sort=id