1. 程式人生 > >Redis實用監控工具一覽

Redis實用監控工具一覽

Redis已經成為web應用開發不可或缺的一個組成部分,在專案中的應用越來越廣泛,這篇文章就來講講那些關於Redis監控的那點事。

vredis-benchmark

1.1 簡介

第一個就介紹一下,Redis自帶的效能檢測工具redis-benchmark, 該工具可以模擬 N 個客戶端同時發出 Y 個請求。 可以使用 redis-benchmark -h 來檢視基準引數。

1.2 命令格式:

redis-benchmark [-h ] [-p ] [-c ] [-n <requests]> [-k ]

1.3 引數介紹:

序號選項描述預設值
1 -h 指定伺服器主機名 127.0.0.1
2 -p 指定伺服器埠 6379
3 -s 指定伺服器 socket  
4 -c 指定併發連線數 50
5 -n 指定請求數 10000
6 -d 以位元組的形式指定 SET/GET 值的資料大小 2
7 -k 1=keep alive 0=reconnect 1
8 -r SET/GET/INCR 使用隨機 key, SADD 使用隨機值  
9 -P 通過管道傳輸 <numreq> 請求 1
10 -q 強制退出 redis。僅顯示 query/sec 值  
11 --csv 以 CSV 格式輸出  
12 -l 生成迴圈,永久執行測試  
13 -t 僅執行以逗號分隔的測試命令列表。  
14 -I Idle 模式。僅開啟 N 個 idle 連線並等待。  

1.4 例項:

1.4.1 同時執行1000個請求來檢測效能:

redis-benchmark -n 1000 -q

1.4.2 50個併發請求,10000個請求,檢測Redis效能:

redis-benchmark -h localhost -p 6379 -c 50 -n 10000

[root@localhost toutou]# redis-benchmark -h localhost -p 6379 -c 50 -n 10000
====== PING_INLINE ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

96.25% <= 1 milliseconds
98.38% <= 2 milliseconds
99.01% <= 3 milliseconds
100.00% <= 4 milliseconds
88495.58 requests per second

====== PING_BULK ======
  10000 requests completed in 0.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

97.74% <= 1 milliseconds
100.00% <= 2 milliseconds
95238.10 requests per second

====== SET ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.44% <= 1 milliseconds
100.00% <= 1 milliseconds
93457.95 requests per second

====== GET ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.33% <= 1 milliseconds
99.13% <= 2 milliseconds
100.00% <= 2 milliseconds
93457.95 requests per second

====== INCR ======
  10000 requests completed in 0.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.28% <= 1 milliseconds
100.00% <= 1 milliseconds
95238.10 requests per second

====== LPUSH ======
  10000 requests completed in 0.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.70% <= 1 milliseconds
100.00% <= 1 milliseconds
97087.38 requests per second

====== RPUSH ======
  10000 requests completed in 0.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.66% <= 1 milliseconds
100.00% <= 1 milliseconds
95238.10 requests per second

====== LPOP ======
  10000 requests completed in 0.15 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

93.78% <= 1 milliseconds
96.51% <= 2 milliseconds
97.35% <= 3 milliseconds
98.41% <= 4 milliseconds
99.02% <= 5 milliseconds
99.23% <= 6 milliseconds
99.46% <= 7 milliseconds
99.96% <= 8 milliseconds
99.97% <= 9 milliseconds
100.00% <= 9 milliseconds
67567.57 requests per second

====== RPOP ======
  10000 requests completed in 0.31 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

65.78% <= 1 milliseconds
84.10% <= 2 milliseconds
90.96% <= 3 milliseconds
94.19% <= 4 milliseconds
95.72% <= 5 milliseconds
97.05% <= 6 milliseconds
98.33% <= 7 milliseconds
98.80% <= 8 milliseconds
99.40% <= 9 milliseconds
99.72% <= 10 milliseconds
100.00% <= 14 milliseconds
31746.03 requests per second

====== SADD ======
  10000 requests completed in 0.19 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

93.00% <= 1 milliseconds
96.88% <= 2 milliseconds
98.33% <= 3 milliseconds
98.92% <= 6 milliseconds
98.94% <= 7 milliseconds
98.95% <= 9 milliseconds
99.04% <= 10 milliseconds
99.48% <= 12 milliseconds
99.61% <= 14 milliseconds
99.62% <= 15 milliseconds
99.99% <= 16 milliseconds
100.00% <= 16 milliseconds
52083.33 requests per second

====== HSET ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

95.90% <= 1 milliseconds
99.95% <= 2 milliseconds
100.00% <= 2 milliseconds
90909.09 requests per second

====== SPOP ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

97.04% <= 1 milliseconds
99.75% <= 2 milliseconds
99.78% <= 3 milliseconds
100.00% <= 3 milliseconds
90909.09 requests per second

====== LPUSH (needed to benchmark LRANGE) ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

96.48% <= 1 milliseconds
99.46% <= 2 milliseconds
99.95% <= 3 milliseconds
100.00% <= 3 milliseconds
87719.30 requests per second

====== LRANGE_100 (first 100 elements) ======
  10000 requests completed in 0.33 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

32.63% <= 1 milliseconds
93.24% <= 2 milliseconds
99.83% <= 3 milliseconds
100.00% <= 3 milliseconds
30303.03 requests per second

====== LRANGE_300 (first 300 elements) ======
  10000 requests completed in 0.85 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

2.65% <= 1 milliseconds
23.01% <= 2 milliseconds
53.33% <= 3 milliseconds
77.25% <= 4 milliseconds
91.47% <= 5 milliseconds
98.58% <= 6 milliseconds
99.99% <= 7 milliseconds
100.00% <= 7 milliseconds
11764.71 requests per second

====== LRANGE_500 (first 450 elements) ======
  10000 requests completed in 1.22 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

1.01% <= 1 milliseconds
9.09% <= 2 milliseconds
28.25% <= 3 milliseconds
50.31% <= 4 milliseconds
68.06% <= 5 milliseconds
81.18% <= 6 milliseconds
90.78% <= 7 milliseconds
96.96% <= 8 milliseconds
99.43% <= 9 milliseconds
100.00% <= 9 milliseconds
8196.72 requests per second

====== LRANGE_600 (first 600 elements) ======
  10000 requests completed in 1.57 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.61% <= 1 milliseconds
4.90% <= 2 milliseconds
14.77% <= 3 milliseconds
28.67% <= 4 milliseconds
44.56% <= 5 milliseconds
59.45% <= 6 milliseconds
72.38% <= 7 milliseconds
82.29% <= 8 milliseconds
90.01% <= 9 milliseconds
95.42% <= 10 milliseconds
98.34% <= 11 milliseconds
99.78% <= 12 milliseconds
100.00% <= 12 milliseconds
6357.28 requests per second

====== MSET (10 keys) ======
  10000 requests completed in 0.19 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

68.40% <= 1 milliseconds
98.61% <= 2 milliseconds
100.00% <= 3 milliseconds
53763.44 requests per second


[root@localhost toutou]# 

vredis-cli

2.1 簡介

檢視redis的連線及讀寫操作

2.2 命令格式

redis-cli -h xx -p yy monitor

2.3 例項:

2.4 redis-cli info:

Redis 監控最直接的方法就是使用系統提供的 info 命令,只需要執行下面一條命令,就能獲得 Redis 系統的狀態報告。

# Server
redis_version:5.0.2                    # Redis 的版本
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:bf5d1747be5380f
redis_mode:standalone
os:Linux 2.6.32-220.7.1.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7                       #gcc版本
process_id:49324                        # 當前 Redis 伺服器程序id
run_id:bbd7b17efcf108fdde285d8987e50392f6a38f48
tcp_port:6379
uptime_in_seconds:1739082               # 執行時間(秒)
uptime_in_days:20                       # 執行時間(天)
hz:10
lru_clock:1734729
config_file:/home/s/apps/RedisMulti_video_so/conf/zzz.conf
 
# Clients
connected_clients:1                     #連線的客戶端數量
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
 
# Memory
used_memory:821848                       #Redis分配的記憶體總量             
used_memory_human:802.59K
used_memory_rss:85532672                 #Redis分配的記憶體總量(包括記憶體碎片)
used_memory_peak:178987632
used_memory_peak_human:170.70M           #Redis所用記憶體的高峰值
used_memory_lua:33792
mem_fragmentation_ratio:104.07           #記憶體碎片比率
mem_allocator:tcmalloc-2.0
 
# Persistence
loading:0
rdb_changes_since_last_save:0            #上次儲存資料庫之後,執行命令的次數
rdb_bgsave_in_progress:0                 #後臺進行中的 save 操作的數量
rdb_last_save_time:1410848505            #最後一次成功儲存的時間點,以 UNIX 時間戳格式顯示
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0                            #redis是否開啟了aof
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
 
# Stats
total_connections_received:5705          #執行以來連線過的客戶端的總數量
total_commands_processed:204013          # 執行以來執行過的命令的總數量
instantaneous_ops_per_sec:0
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:34401                       #執行以來過期的 key 的數量
evicted_keys:0                           #執行以來刪除過的key的數量
keyspace_hits:2129                       #命中key 的次數
keyspace_misses:3148                     #沒命中key 的次數
pubsub_channels:0                        #當前使用中的頻道數量
pubsub_patterns:0                        #當前使用中的模式數量
latest_fork_usec:4391
 
# Replication
role:master                              #當前例項的角色master還是slave
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
 
# CPU
used_cpu_sys:1551.61
used_cpu_user:1083.37
used_cpu_sys_children:2.52
used_cpu_user_children:16.79
 
# Keyspace
db0:keys=3,expires=0,avg_ttl=0             #各個資料庫的 key 的數量,以及帶有生存期的 key 的數量

redis-cli info

結果會返回 Server、Clients、Memory、Persistence、Stats、Replication、CPU、Keyspace 8個部分。從info大返回結果中提取相關資訊,就可以達到有效監控的目的。

vshowlog

3.1 簡介

redis的slowlog是redis用於記錄記錄慢查詢執行時間的日誌系統。由於slowlog只儲存在記憶體中,因此slowlog的效率很高,完全不用擔心會影響到redis的效能。Slowlog是Redis從2.2.12版本引入的一條命令。

3.2 命令格式

在redis-cli中有關於slowlog的設定:

CONFIG SET slowlog-log-slower-than 6000

CONFIG SET slowlog-max-len 25

3.3 例項:


上面介紹的都是關於Redis自帶的命令化效能查詢工具。下面介紹介紹一些第三方的Redis視覺化效能監控工具。

vRedisLive

4.1 簡介

RedisLive是由Python編寫的開源的圖形化監控工具。核心服務部分只包括一個web服務和基於Redis自帶的Info命令以及monitor命令的監控服務。支援多例項監控,監控資訊可以使用redis儲存和sqlite持久化儲存。

4.2 安裝

4.2.1 安裝依賴環境

RedisLive是由Python2.X編寫的,所以最好使用Python2.7來執行RedisLive,在CentOS 7中預安裝了Python2.7,但沒有安裝Python的包管理器pip。

yum install epel-release
sudo yum install python-pip
pip install --upgrade pip
pip install tornado
pip install redis
pip install python-dateutil

4.2.2 安裝RedisLive

git clone https://github.com/nkrode/RedisLive.git

4.2.3 修改配置檔案redis-live.conf

cd RedisLive/src

//按照以下方式修改配置檔案
{
    "RedisServers":        
    [ 
        #在此處新增需要監控的redis例項
        {
              "server": "127.0.0.1",                #redis監聽地址,此處為本機
              "port" : 6379,                        #redis埠號,可以通過lsof -i | grep redis-ser檢視 redis-server埠號
              "password" : "some-password"          #redis認證密碼,如果沒有可以刪除該行,注意json格式
        }        
    ],

    "DataStoreType" : "redis",        #監控資料儲存方案的配置,可選擇redis或sqllite
    #用來儲存監控資料的 Redis 例項
    "RedisStatsServer":    
    {
        "server" : "127.0.0.1",
        "port" : 6379,
        "password" : "some-password"
    },
    #監控資料持久化資料儲存配置
    "SqliteStatsStore" :
    {
        "path":  "db/redislive.sqlite"    #redis資料檔案
    }
}

redis-live.conf的配置可以參考redis-live.conf.example

4.3 啟動

啟動監控服務,每60秒監控一次

./redis-monitor.py --duration=60

再次開啟一個終端,進入/root/RedisLive/src目錄,啟動web服務

./redis-live.py

4.4 效果圖

vredis-faina

5.1 簡介

5.1.1 背景

redis-faina是由Instagram開發並開源的一個 Redis 查詢分析小工具。Instagram團隊曾經使用 PGFouine 來作為其PostgreSQL的查詢分析工具,他們覺得Redis也需要一個類似的工具來進行query分析工作,於是開發了 redis-faina。

5.1.1 概念

redis-faina 是通過Redis的 MONITOR命令來實現的,通過對在Redis上執行的query進行監控,統計出一段時間的query特性。

5.2 安裝

git clone https://github.com/facebookarchive/redis-faina.git

5.3 命令介紹

[root@localhost toutou]# cd redis-faina/
[root@localhost redis-faina]# ls
heroku-redistogo-faina.sh  LICENSE  README.md  redis-faina.py
[root@localhost redis-faina]# ./redis-faina.py -h
usage: redis-faina.py [-h] [--prefix-delimiter PREFIX_DELIMITER]
                      [--redis-version REDIS_VERSION]
                      [input]

positional arguments:
  input                 File to parse; will read from stdin otherwise

optional arguments:
  -h, --help            show this help message and exit
  --prefix-delimiter PREFIX_DELIMITER
                        String to split on for delimiting prefix and rest of
                        key
  --redis-version REDIS_VERSION
                        Version of the redis server being monitored
[root@localhost redis-faina]# 

其中 --prefix-delimiter 主要用於統計字首的key的資料。

可以通過 redis MONITOR 命令以及管道進行分析,例如:

redis-cli -p 6379 MONITOR | head -n | ./redis-faina.py [options]

或者

redis-cli -p 6379 MONITOR > outfile.txt

./redis-faina.py ./outfile.txt

Overall Stats
========================================
Lines Processed     117773
Commands/Sec        11483.44

Top Prefixes
========================================
friendlist          69945
followedbycounter   25419
followingcounter    10139
recentcomments      3276
queued              7

Top Keys
========================================
friendlist:zzz:1:2     534
followingcount:zzz     227
friendlist:zxz:1:2     167
friendlist:xzz:1:2     165
friendlist:yzz:1:2     160
friendlist:gzz:1:2     160
friendlist:zdz:1:2     160
friendlist:zpz:1:2     156

Top Commands
========================================
SISMEMBER   59545
HGET        27681
HINCRBY     9413
SMEMBERS    9254
MULTI       3520
EXEC        3520
LPUSH       1620
EXPIRE      1598

Command Time (microsecs)
========================================
Median      78.25
75%         105.0
90%         187.25
99%         411.0

Heaviest Commands (microsecs)
========================================
SISMEMBER   5331651.0
HGET        2618868.0
HINCRBY     961192.5
SMEMBERS    856817.5
MULTI       311339.5
SADD        54900.75
SREM        40771.25
EXEC        28678.5

Slowest Calls
========================================
3490.75     "SMEMBERS" "friendlist:zzz:1:2"
2362.0      "SMEMBERS" "friendlist:xzz:1:3"
2061.0      "SMEMBERS" "friendlist:zpz:1:2"
1961.0      "SMEMBERS" "friendlist:yzz:1:2"
1947.5      "SMEMBERS" "friendlist:zpz:1:2"
1459.0      "SISMEMBER" "friendlist:hzz:1:2" "zzz"
1416.25     "SMEMBERS" "friendlist:zhz:1:2"
1389.75     "SISMEMBER" "friendlist:zzx:1:2" "zzz"

v部落格總結

關於Redis的監控工具還有很多,這裡就不一一列舉了,下面給出其它幾款優秀的Redis監控工具連結,感興趣的可以看看。

其他監控工具:

  • https://github.com/junegunn/redis-stat
  • https://github.com/steelThread/redmon
  • https://github.com/oliver006/redis_exporter


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!