1. 程式人生 > >一行shell檢視redis 連線數分佈

一行shell檢視redis 連線數分佈

背景

線上某個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 [email protected] 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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!