背景:最近生产环境中出现了一次Redis客户端连接数占满的事故,记录一下Redis客户端连接数高的排查思路,并深度学习一下Redis客户端连接方面的知识。

1.Redis客户端建立连接的过程

Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:

  • 首先,客户端 socket 被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型。
  • 然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法
  • 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送

所以Redis连接数过高会占用一定的网络带宽,多个客户端会带来很大的网络开销,影响Redis性能。

2.Redis客户端相关配置

  • maxclients:Redis的连接数可以通过配置参数maxclients来做限制,超过这个配置后,将无法建立新的连接。
  • timeout:服务端根据hz频率定时检测所有 client 的空闲时间是否超过配置的 timeout 值,如果超过timeout参数就会关闭这个连接,空闲时长可以根据client list 查看服务端的连接信息,其中的idle值就表示空闲时长。
  • tcp-keepalive:服务端会根据这个参数定时给客户端发送 TCP 心跳包,检测网络连通性,当网络异常时,可以尽快清理TCP僵尸连接。   当客户端与服务端网络发生问题时,服务端并不会立即释放这个 client ,如果 Redis 没有开启 tcp-keepalive 的话,服务端直到配置timeout 时间后,才会清理释放这个 client 。在没有清理之前,如果还有大量新连接进来,就有可能导致 Redis 服务端内部持有的 client 超过了 maxclients,这时新连接就会被拒绝。所以建议开启此配置。
  • tcp-backlog:TCP三次握手后,会将接受的连接放入队列中,tcpbacklog就是队列的大小,它在Redis中的默认值是511。通常来讲这个参数不需要调整,但是这个参数会受到操作系统的影响,例如在Linux操作系统中,如果/proc/sys/net/core/somaxconn小于tcp-backlog,那么在Redis启动时会看到如下日志,并建议将/proc/sys/net/core/somaxconn设置更大。
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/
sys/net/core/somaxconn is set to the lower value of 128.

tcp-backlog只能再配置文件中提前配置,下面这三个参数配置都可以动态的进行调整:

192.168.79.136:6379> config set maxclients 1000
OK
192.168.79.136:6379> config set timeout 60
OK
192.168.79.136:6379> config set tcp-keepalive 60
OK

3.主动关闭Redis客户端的场景

  • 如果客户端进程退出或者被杀死,那么客户端与服务器之间的网络连接将被关闭,从而造成客户端被关闭。
  • 如果客户端向服务器发送了带有不符合协议格式的命令请求,那么这个客户端也会被服务器关闭。
  • 如果客户端成为了CLIENT KILL命令的目标,那么它也会被关闭。
  • 如果用户为服务器设置了timeout配置选项,那么当客户端的空转时间超过timeout选项设置的值时,客户端将被关闭。不过timeout选项有一些例外情况:如果客户端是主服务器(打开了REDIS_MASTER标志),从服务器(打开了REDIS_SLAVE标志),正在被BLPOP等命令阻塞(打开了REDIS_BLOCKED标志),或者正在执行SUBSCRIBE、PSUBSCRIBE等订阅命令,那么即使客户端的空转时间超过了timeout选项的值,客户端也不会被服务器关闭。
  • 如果客户端发送的命令请求的大小超过了输入缓冲区的限制大小(默认为1 GB),那么这个客户端会被服务器关闭。
  • 如果要发送给客户端的命令回复的大小超过了输出缓冲区的限制大小,那么这个客户端会被服务器关闭。

4.Redis连接数高的排查方法

服务端排查:

  • 通过redis-cli client list 命令可以查看客户端的连接信息:

序号 参数 含义
1 id 客户端连接id
2 addr 客户端连接ip和端口
3 fd socket文件描述符
4 name 客户端连接名
5        age 客户端连接存活时间
6 idle 客户端连接空闲时间
7 flags 客户端类型标识
8 db 使用的数据库下标
9 sub/psub 当前客户端订阅的频道或模式数
10         multi 当前事务中已执行的命令个数
11 qbuf 输入缓存区总容量
12 qbuf-free 输入缓存区剩余容量
13 obl 固定缓存区的长度
14 oll 动态缓存区列表的长度
15 omem 固定缓存区和动态缓存区使用的容量
16 events 文件描述符事件:r和w代表客户端套接字的可读和可写
17 cmd 当前客户端最后一次执行的命令
  • 当连接数高时,可以通过client list 来排查占用连接最多的IP,通过以下命令可以快速查找占用redis连接最多的top5

redis-cli -h 127.0.0.1 -p 6379  client list |awk -F " " '{print $2}'|awk -F "=" '{print $2}'|cut -d ":" -f1| sort | uniq -c | sort -n -r | head -n 5
  • 当redis连接超过maxclients时,无法通过client list 来排除问题时,可以通过netstat 命令来排查占用redis端口最多的top5

 netstat -tan|awk -F " " '{print $4,$5}'|grep :6379 |cut -d " " -f2 |grep -v :6379 |cut -d ":" -f1 |sort |uniq -c |sort -rn
  • 当出现连接数被打满的运维场景时,可以临时调大maxclients,亦或是进行一次故障转移,切换客户端连接的Master节点,maxclients默认是10000(取决于操作系统的文件描述符限制的最大数量)

127.0.0.1:6379> config get maxclients
1) "maxclients"
2) "3984"
  • 如果以上方法无法解决,可以考虑通过服务端强制断开与客户端的连接,使用redis-cli client kill 命令批量杀掉占用连接最多的客户端。可以参考以下命令:

redis-cli -h 127.0.0.1 -p 6379 client list | grep '占用连接最多的客户端IP' | awk '{print $2}' | awk -F '=' '{print $2}'| xargs -i  /usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 client kill {}

客户端排查:

客户端部署在Win系统:

netstat -ano  |find  /c “6379”   //统计占用6379端口的总数netstat -ano | find "6379"   //找出占用6379的进程pidtasklist | findstr "pid" //查看进程pid对应的进程名taskkill  /f /t /im "进程名称"      //结束该进程
/f 强制结束   /t  结束该进程的子进程    /im   指定要终止的进程的映像名称

客户端部署在Linux系统:

netstat -tuanlp |grep 6379    //查看占用6379端口的进程pidps -ef |grep pid    //查看进程pid对应的进程名

5.客户端信息统计概览

Redis本身提供了一些命令可以对客户端连接信息进行统计。

192.170.79.136:6379> info clients
# Clients
connected_clients:31
client_recent_max_input_buffer:8
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0

下面解释一下上图各个指标的含义:

1)connected_clients:代表当前Redis节点的客户端连接数,需要重点监控,一旦超maxclients,新的客户端连接将被拒绝。
2)client_longest_output_list:当前所有输出缓冲区中队列对象个数的最大值。
3)client_biggest_input_buf:当前所有输入缓冲区中占用的最大容量。
4)blocked_clients:正在执行阻塞命令(例如blpop、brpop、brpoplpush)的客户端个数。

除此之外 info stats 中还包含了两个客户端相关的统计指标,如下:

192.170.79.136:6379> info stats
# Stats
total_connections_received:3719386
.......
.......
rejected_connections:0

total_connections_received:Redis自启动以来处理的客户端连接数总数。

rejected_connections:Redis自启动以来拒绝的客户端连接数,需要重点监控。

Redis之客户端连接相关推荐

  1. Redis 处理客户端连接的一些内部实现机制

    本文主要介绍了 Redis 处理客户端连接的一些内部实现机制,包括连接处理.超时.缓冲区等一系列内容. 注:本文所述内容基于 Redis2.6 及以上版本. 连接的建立 Redis 通过监听一个 TC ...

  2. Redis:本地客户端连接远程服务器方法

    Redis:本地客户端连接远程服务器方法 找到本地redis-cli.exe存放位置,打开命令行 输入下面命令 ./redis-cli -h 127.0.0.1 -p 6379 其中127.0.0.1 ...

  3. linux redis 查看客户端连接数量,Redis如何处理客户端连接?

    本文主要介绍了 Redis 处理客户端连接的一些内部实现机制,包括连接处理.超时.缓冲区等一系列内容.(注:本文所述内容基于 Redis2.6 及以上版本.) 连接的建立 Redis通过监听一个 TC ...

  4. Redis查看客户端连接

    单个实例查看客户端连接较为简单 client list 现在手上拿到几台物理机,每台物理机部署了100个实例,由于是以前遗留下来的实例,不知道能否下线,想知道这批机器是否有人使用? 如果想知道有没有人 ...

  5. php客户端连接远程redis,phpredis客户端连接Redis--华为云DCS for Redis使用经验

    使用php连接Redis.Memcache等都需要进行扩展,以CentOS为例,介绍phpredis的客户端环境搭建. 第0步:准备工作 华为云上购买1台弹性云服务器ECS(我选了CentOS 6.3 ...

  6. centos安装redis并客户端连接_Linux(Centos)之安装Redis及注意事项

    阅读目录 1.redis简单说明 2.准备工作 3.gcc的安装 4.Tcl的安装 5.redis的安装 6.redis的测试 7.Linux中设置redis的服务器启动和关闭 8.Linux中设置r ...

  7. 开启redis远程客户端连接

  8. centos安装redis并客户端连接_网络共享打印机图文教程,电脑客户端连接安装设置共享打印机方法...

    大家好,我是老盖,首先感谢观看本文,本篇文章做的有视频,视频讲述的比较详细,也可以看我发布的视频. 今天给大家讲一下网络共享打印机,客户端连接共享打印机的方法,电脑点开始,选择设备和打印机,也可以从控 ...

  9. Redis基础知识之————如何处理客户端连接

    redis 连接建立 Redis Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作: 首先,客户端 ...

最新文章

  1. python subprocess.Popen 使用简介
  2. [转载]一个Spectral Clustering方法的小结
  3. PHP获取IP地址所在的地理位置
  4. python找色_python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
  5. Python学习week7-文件路径操作
  6. Ural_1003 Parity(并查集)
  7. bs后端开发语言_哪种编程语言适合后端开发?Java和PHP的区别在哪?
  8. 无法连接到WMI提供程序。你没有权限或者该服务器无访问
  9. 华为机试HJ90:合法IP
  10. 名企面试官精讲典型编程题之数据结构数组篇
  11. 格式化Mac硬盘---DoYourData Super Eraser安全、快速
  12. oracle grant的用法,oracle grant总结
  13. 南大计算机专业考研2019分数,南京大学2019考研分数线公布
  14. Windows如何对硬盘进行分区?
  15. 机器学习中的核函数与核方法(是什么?为什么?怎么做?)
  16. java 区号_区号查询示例代码
  17. 1357:车厢调度 (栈)
  18. Statistic Helper 开发自查帮助文档(五):Sliced Inverse Regression
  19. jar完整性测试的Java代码
  20. 点赞动画,鼠标点击动画

热门文章

  1. Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava
  2. 使用AS3.0开发FC超级马里奥
  3. (二)DSP28335基础教程——GPIO输入(矩阵按键扫描)
  4. 解读支持向量机SVM
  5. [附源码]计算机毕业设计JAVA高铁售票管理系统
  6. 软件测试是否有存在的必要?带你了解测试的重要性!
  7. 无线投屏器有哪些分类,该如何挑选?
  8. 使用 python 实现 获取与本机在同一局域网下的其他设备 IP和MAC的映射关系(Windows 下
  9. 计算机微机组装与维护形考1,最新国开电大《ERP原理与应用》形考任务实验1至5作业及答案...
  10. 计算机网络实验-验证性实验