redis-benchmark Could not connect to Redis问题

为了做实验,需要在虚拟机中安装redis并使用redis-benchmark测试性能。 但是在使用redis-benchmark模拟2000个客户端的请求的时候,出现了Could not connect to Redis at localhost:10081: Name or service not known的问题。

执行redis-benchmark的命令是

1
2
redis-server ./server-0.conf		# 启动redis-server,监听的端口是10081端口
redis-benchmark -h localhost -p 10081 -c 2000 -n 200000000 -q -t get -P 8

提示的错误信息是

1
Could not connect to Redis at localhost:10081: Name or service not known

首先可以确定,redis-server确实是运行在10081端口的。经过一番修改参数,将-c的参数反复修改后发现,-c的值为1020的时候刚好可以运行redis-benchmark,再增大一点,就会报上面的错。

猜测一:
首先,我猜测可能是配置中限制了最大客户端连接数。但是检查配置文件,发现设置的值为10000,远比1020大。并且第二次启动redis-server的时候,我有在命令的参数中增加了--maxclients 20000的参数。但是依然不行。

猜测二:
系统限制了进程能够使用的资源数量,比如进程能够创建的子线程数、进程能够打开的文件句柄数、进程能够创建的socket连接数等,参数设置的值超过了系统的限制值(事实证明就是这个原因)。

参考了Linux下高并发socket最大连接数所受的各种限制中关于linux下进程对于硬资源和软资源的限制的相关说明。

总的来说,linux下对系统进程能够打开的文件数目、线程数目和socket数目都有限制。linux中使用ulimit命令可以进行查看和修改。

1
2
[root@vm1 redis]# ulimit -n
1024

上面的命令可以看到,系统限制的可打开最大文件数是1024,之前测试的结果显示,redis-benchmark可发起的最大请求是1020,正好比系统默认的1024小一点。

如果只是临时修改系统的配置,可以使用下面的命令:

1
ulimit -SHn 20480

尝试将系统的限制最大文件数目修改为更大一些。

  1. 修改/etc/security/limits.conf文件,添加如下两行:

    • soft nofile 20480
    • soft nofile 20480
  2. 修改/etc/pam.d/login文件,添加线面一行:
    session required /lib/security/pam_limits.so

修改完成后,重启系统。上面的修改中,第一步的意思是,针对每一个用户,都将可打开的文件数目修改为20480;第二歩的操作使得系统在每次用户登录的时候,都去调用/lib/security/pam_limits.so这个库文件,这个库文件会读取第一步中的设置,使设置生效。

再来看看系统当前对进程可打开文件数目的限制情况:

1
2
[root@vm1 redis]# ulimit -n
20480

再执行前面的benchmark命令就正常了,但是在将并发的客户端数目增大到6000的时候,还是会出现不稳定的现象,/var/log/message文件中出现了下面的日志:

1
vm2 kernel: TCP: Possible SYN flooding on port 10083. Sending cookies.  Check SNMP counters.

并且执行的命令会意外中断。猜测应该是系统的TCP连接数受限制了。