赞
踩
背景:最近生产环境中出现了一次Redis客户端连接数被打爆的事故,打算简单记录一下Redis客户端连接数高的排查思路,并深度学习一下Redis客户端方面的知识。
Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:
所以Redis连接数过高会占用一定的网络带宽,多个客户端会带来很大的网络开销,影响Redis性能。
- 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
序号 | 参数 | 含义 |
---|---|---|
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 | 当前客户端最后一次执行的命令 |
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
netstat -tan|awk -F " " '{print $4,$5}'|grep :6379 |cut -d " " -f2 |grep -v :6379 |cut -d ":" -f1 |sort |uniq -c |sort -rn
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 {}
- netstat -ano |find /c “6379” //统计占用6379端口的总数
-
- netstat -ano | find "6379" //找出占用6379的进程pid
-
- tasklist | findstr "pid" //查看进程pid对应的进程名
-
- taskkill /f /t /im "进程名称" //结束该进程
- /f 强制结束 /t 结束该进程的子进程 /im 指定要终止的进程的映像名称
- netstat -tuanlp |grep 6379 //查看占用6379端口的进程pid
-
- ps -ef |grep pid //查看进程pid对应的进程名
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自启动以来拒绝的客户端连接数,需要重点监控。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。