获取服务器支持的最大文件描述符数(该 值会限制你的最大文件打开数,对咱们而言,关心的是可供打开的socket的数量)linux
linux机器可使用 ulimit 命令获取你关心的一些指数redis
能够看到支持的最大文件描述符数是4000数据库
也能够直接经过 ulimit -n 获取文件描述符数windows
还能够经过该命令修改最大文件描述符数api
在咱们线上机器系统配置文件对应位置为:/etc/sysctl.conf,目前咱们线上机器配置的最大文件描述符数为655350服务器
关于redis配置文件一些参数的理解:并发
daemonize no/yes Redis默认不是以守护进程的方式运行,能够经过该配置项修改,使用yes启用守护进程(我我的是理解就是设置为yes能够支持后台运行redis)app
port 6379 指定Redis监听端口,默认端口为6379socket
bind 127.0.0.1 绑定的主机地址tcp
timeout 300 当 客户端闲置多长时间后关闭链接,若是指定为0,表示关闭该功能
databases 16 设置数据库的数量,默认数据库为0,可使用SELECT <dbid>命令在链接上指定数据库id
maxclients 128 设置同一时间最大客户端链接数,默认无限制,Redis能够同时打开的客户端链接数为Redis进程能够打开的最大文件描述符数,若是设置 maxclients 0,表示不做限制。当客户端链接数到达限制时,Redis会关闭新的链接并向客户端返回max number of clients reached错误信息(因此想要让redis支持更多的链接数,须要将文件描述符数和maxclients同时设置的大一些,而最终的最大链接数取决于两者较小的那个值)
经过以上两种设置,貌似redis已经能够支持大量的客户端链接了,可是采用 redis-benchmark 进行压力测试,会出现以下错误:
-- Could not connect to Redis at IP:PORT,Cannot assign requested address.
这是由于redis-benchmark的压力测试时频繁的连服务器,数据量较大的时候,因为每次链接都在很短的时间内结束,致使不少的TIME_WAIT,以致于用光了可用的端口号,因此新的链接没办法绑定端口,即“Cannot assign requestedaddress”。
能够经过 netstat -ant|grep TIME_WAIT 过滤出来大量的未关闭链接,效果大概是下边这个样子
这时,你须要让系统知道对于这种TIME_WAIT的TCP链接应该快速回收,以释放端口,供更多的客户端能够请求分配到端口并访问咱们的redis
命令以下:
sysctl -w net.ipv4.tcp_timestamps=1 #开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起做用
sysctl -w net.ipv4.tcp_tw_recycle=1 #表示开启TCP链接中TIME-WAIT sockets的快速回收
执行后,利用 redis-benchmark 作压力测试,不会再出现 Cannot assign requested address 这个错误
redis-benchmark 压力测试命令:
redis-benchmark -h 127.0.0.1 -p 6379 -c 20000 -n 20000 (h对应参数为ip,p对应参数为端口,c对应参数为并发链接数,n对应参数为请求数量)
这时,你能够看到高并发时 redis 对于不一样操做的平均响应时长(只截取部分结果)
在xadtest这台机器上测试20000并发链接数,20000个请求的效果数据如图(能够看到最长响应时长已经达到577ms,目前咱们线上服务器的平均响应时长为110ms左右;PS:可能线上的服务器响应效果会好一些,可是有业务在跑,就没作测试):
须要额外提一点:上边提到要让服务器快速关闭TIME_WAIT的TCP链接,会对系统设置作两个修改
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_recycle=1
可是目前咱们线上服务器配置文件里的内容为:
#时间戳能够避免序列号的卷绕。一个1Gbps的链路确定会遇到之前用过的序列号。时间戳可以让内核接受这种“异常”的数据包。这里须要将其关掉
net.ipv4.tcp_timestamps = 0 (与上述修改是有冲突存在的)
#开启TCP链接复用功能,容许将time_wait sockets从新用于新的TCP链接(主要针对time_wait链接)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
贸然更改系统配置,是会影响咱们的线上服务的,测试操做请上测试机!!!
本文内容在类linux环境使用,不适用mac/windows
后续若是涉及到redis集群,会再作补充