背景
线上某个redis连接数过万,老报警,于是产生刚需:快速知道某个redis的client分布.
用于快速找出连接数占用最多的客户端.
shell
习惯python的老司机处理这点小事,那还不是手到擒来.可是偶尔不也想装个逼,用shell么?
先上代码,接着解读
#!/bin/bash
host=$1
port=$2
echo $host: $port
redis-cli -h $host -p $port client list | awk '{print $2}'|
cut -d = -f 2| cut -d : -f 1 | sort | uniq -c | sort -rn |
awk '{"host " $2 | getline h; print $1 "\t" $2 "\t" h;}'| awk '{print $1 "\t" $2 "\t" $7}'
举例子:
./redis-cli -h 195.203.6.51 -p 6379 -a key@creditcard client list | awk '{print $2}'| cut -d = -f 2| cut -d : -f 1 | sort | uniq -c | sort -rn | awk '{"195.203.6.51 " $2 | getline h; print $1 "\t" $2 "\t" h;}'| awk '{print $1 "\t" $2 "\t" $7}'
此行较长,CSDN显示有问题,请复制该行,获取代码
解读
首先是redis-cli的client list命令列出所有client信息.
注意:如果client数特别多,可能超过输出长度限制
每一行输出信息如下:
id=2 addr=127.0.0.1:49759 fd=5 name= age=5471 idle=5455 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get
接着是awk输出第二列addr=127.0.0.1:49759
接着是cut命令,-d =指定以=分隔, -f 2获取分隔后的第二列,也就是127.0.0.1:49759
同上,继续cut,:分隔,取第一列127.0.0.1(客户端IP)
感觉这两个cut可以合二为一
接着sort排序
接着uniq -c去重计数,统计出每个IP多少个链接
接着sort -rn按连接数排个倒序.结果如下
160 10.83.72.99
142 10.83.80.63
141 10.83.73.112
140 10.83.80.101
140 10.83.203.68
139 10.83.73.118
139 10.83.212.136
135 10.83.225.53
135 10.83.225.33
132 10.83.80.103
132 10.83.225.52
128 10.83.225.32
128 10.83.225.31
125 10.83.73.89
125 10.83.200.53
123 10.83.72.217
16 127.0.0.1
这个时候已经知道那些客户端占用连接数最多了,但是显示的是IP,不直观,能不能把IP那一列换成域名或者说主机名呢?
接着awk '{"host " $2 | getline h; print $1 "\t" $2 "\t" h;}'
慢慢来,花括号里一共两条语句,第一条语句对第二例(也就是IP)调用系统命令host,同时把结果保存在变量h里.getline获取前面shell的结果,传参就存在参数里,不传就默认 $0
print输出第一列(计数),第二列(IP),h(主机信息,也就是host命令的结果)
---------------------
作者:secretx
来源:CSDN
原文:https://blog.csdn.net/secretx/article/details/73498148
版权声明:本文为博主原创文章,转载请附上博文链接!