Redis狀態與性能監控
Redis介紹
Redis是一種高級key-value數據庫。它跟memcached類似,不過數據可以持久化,而且支持的數據類型很豐富。有字符串,鏈表、哈希、集合和有序集合5種。支持在服務器端計算集合的並、交和補集(difference)等,還支持多種排序功能。所以Redis也可以被看成是一個數據結構服務器。Redis的所有數據都是保存在內存中,然后不定期的通過異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次數據變化都寫入到一個append only file(aof)里面(這稱為“全持久化模式”)
1、redis-benchmark
redis基准信息,redis服務器性能檢測
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
100個並發連接,100000個請求,檢測host為localhost 端口為6379的redis服務器性能
[root@Architect redis-1.2.6]# redis-benchmark -h localhost -p 6379 -c 100 -n 100000 ====== PING ====== 10001 requests completed in 0.41 seconds 50 parallel clients 3 bytes payload keep alive: 10.01% <= 0 milliseconds
23.09% <= 1 milliseconds
85.82% <= 2 milliseconds
95.60% <= 3 milliseconds
97.20% <= 4 milliseconds
97.96% <= 5 milliseconds
98.83% <= 6 milliseconds
99.41% <= 7 milliseconds
99.70% <= 8 milliseconds
99.99% <= 9 milliseconds
100.00% <= 12 milliseconds
24274.27 requests per second
2、redis-cli
redis-cli -h localhost -p 6380 monitor
Dump all the received requests in real time;
監控host為localhost,端口為6380,redis的連接及讀寫操作
[root@Architect redis-1.2.6]# redis-cli -h localhost -p 6380 monitor
+OK
+1289800615.808225 "monitor"
+1289800615.839079 "GET" "name"
+1289800615.853694 "PING"
+1289800615.853783 "PING"
+1289800615.854646 "PING"
+1289800615.854974 "PING"
+1289800615.857693 "PING"
+1289800615.866862 "PING"
+1289800615.871944 "PING"
redis-cli -h localhost -p 6380 info
Provide information and statistics about the server ;
提供host為localhost,端口為6380,redis服務的統計信息
[root@Architect redis-1.2.6]# redis-cli -h localhost -p 6380 info
redis_version:2.0.4
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:32
multiplexing_api:epoll
process_id:21990
uptime_in_seconds:490580
uptime_in_days:5
connected_clients:103
connected_slaves:0
blocked_clients:0
used_memory:4453240
used_memory_human:4.25M
changes_since_last_save:200
bgsave_in_progress:0
last_save_time:1290394640
bgrewriteaof_in_progress:0
total_connections_received:809
total_commands_processed:44094018
expired_keys:0
hash_max_zipmap_entries:64
hash_max_zipmap_value:512
pubsub_channels:0
pubsub_patterns:0
vm_enabled:0
role:slave
master_host:localhost
master_port:6379
master_link_status:up
master_last_io_seconds_ago:18
db0:keys=1319,expires=0
3、redis-stat
redis-stat host localhost port 6380 overview
Print general information about a Redis instance;
實時打印出host為localhost,端口為6380,redis實例的總體信息
[root@Architect redis-1.2.6]# redis-stat port 6380 overview
------- data ------ ------------ load ----------------------------- - childs -
keys used-mem clients requests connections
1319 5.37M 103 44108021 (+44108021) 810
1319 5.38M 103 44108124 (+103) 810
1319 5.38M 103 44108225 (+101) 810
1319 5.39M 103 44108326 (+101) 810
1319 5.40M 103 44108427 (+101) 810
1319 5.41M 103 44108528 (+101) 810
redis-stat host localhost port 6380 overview
Measure Redis server latency;
輸出host為localhost,端口為6380,redis服務中每個請求的響應時長
[root@Architect redis-1.2.6]# redis-stat port 6380 latency
1: 0.16 ms
2: 0.11 ms
3: 0.15 ms
4: 0.11 ms
5: 0.18 ms
6: 0.14 ms
二、 Redis監控
首先判斷客戶端和服務器連接是否正常
# 客戶端和服務器連接正常,返回PONG
redis> PING
PONG
客戶端和服務器連接不正常(網絡不正常或服務器未能正常運行),返回連接異常
redis 127.0.0.1:6379> PING
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Redis 監控最直接的方法就是使用系統提供的 info 命令,只需要執行下面一條命令,就能獲得 Redis 系統的狀態報告。
redis-cli info
結果會返回 Server、Clients、Memory、Persistence、Stats、Replication、CPU、Keyspace 8個部分。從info大返回結果中提取相關信息,就可以達到有效監控的目的。
先解釋下各個參數含義
# Server
redis_version:2.8.8 # 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 使用的內存超出了可用的物理內存大小,那么 Redis 很可能系統會被殺掉。針對這一點,你可以通過 info 命令對 used_memory 和 used_memory_peak 進行監控,為使用內存量設定閥值,並設定相應的報警機制。當然,報警只是手段,重要的是你得預先計划好,當內存使用量過大后,你應該做些什么,是清除一些沒用的冷數據,還是把 Redis 遷移到更強大的機器上去。
持久化
如果因為你的機器或 Redis 本身的問題導致 Redis 崩潰了,那么你唯一的救命稻草可能就是 dump 出來的rdb文件了,所以,對 Redis dump 文件進行監控也是很重要的。可以通過對rdb_last_save_time 進行監控,了解最近一次 dump 數據操作的時間,還可以通過對rdb_changes_since_last_save進行監控來獲得如果這時候出現故障,會丟失(即已改變)多少數據。
Keys
通過獲取Keyspace中的結果得到各個數據庫中key的數量
QPS
即每分鍾執行的命令個數,即:(total_commands_processed2-total_commands_processed1)/span,為了實時得到QPS,可以設定腳本在后台運行,記錄過去幾分鍾的total_commands_processed。在計算QPS時,利用過去的信息和當前的信息得出QPS的估計值。
三、 showlog功能
Redis 有一個實用的slowlog功能,正如你可以猜到的,可以讓你檢查運行緩慢的查詢。
Slowlog 將會記錄運行時間超過Y微秒的最后X條查詢. X 和 Y 可以在 redis.conf 或者在運行時通過 CONFIG 命令:
CONFIG SET slowlog-log-slower-than 5000
CONFIG SET slowlog-max-len 25
slowlog-log-slower-than 是用來設置微秒數的, 因此上面的設置將記錄執行時間超過5秒的查詢. 要獲取記錄的日志,你可以使用 SLOWLOG GET X 命令, 這里 X 是你想要獲取的記錄條數:
SLOWLOG GET 10
四、Redis中統計各種數據大小的方法
Redis 內存比較大的話,我們就不太容易查出是哪些(種)鍵占用的空間。
有一些工具能夠提供必要的幫助,比如 redis-rdb-tools 可以直接分析 RDB 文件來生成報告
五、超強、超詳細Redis數據庫入門教程
http://www.jb51.net/article/56448.htm
六、 Redis操作命令總結
http://www.jb51.net/article/61793.htm
七、Redis存儲策略和最大內存
在redis中,允許用戶設置最大使用內存大小maxmemory(需要配合maxmemory-policy使用),設置為0表示不限制;當redis內存數據集快到達maxmemory時,redis會實行數據淘汰策略。Redis提供6種數據淘汰策略:
- volatile-lru:從已設置過期時間的內存數據集中挑選最近最少使用的數據 淘汰;
- volatile-ttl: 從已設置過期時間的內存數據集中挑選即將過期的數據 淘汰;
- volatile-random:從已設置過期時間的內存數據集中任意挑選數據 淘汰;
- allkeys-lru:從內存數據集中挑選最近最少使用的數據 淘汰;
- allkeys-random:從數據集中任意挑選數據 淘汰;
- no-enviction(驅逐):禁止驅逐數據。(默認淘汰策略。當redis內存數據達到maxmemory,在該策略下,直接返回OOM錯誤);
關於maxmemory設置,通過在redis.conf中maxmemory參數設置,或者通過命令CONFIG SET動態修改
關於數據淘汰策略的設置,通過在redis.conf中的maxmemory-policy參數設置,或者通過命令CONFIG SET動態修改
如127.0.0.1:6379>CONFIG GET maxmemory
1) “maxmemory"
2) “0”
127.0.0.1:6379>CONFIG SET maxmemory 100MB
OK
127.0.0.1:6379>CONFIG GET maxmemory
- “maxmemory"
- “104857600”
注意,在64bit系統下,maxmemory設置為0表示不限制Redis內存使用,在32bit系統下,maxmemory不能超過3GB;
應用:
如mysql里有2000w條數據,redis只存20w條熱點數據,如何保證redis中的數據都是熱點數據?
這就能設置最大內存,再設置淘汰策略,設置volatile-lru,allkeys-lru等都可以;
設置Redis最大占用內存
Redis設置最大占用內存,打開redis配置文件,找到如下段落,設置maxmemory參數,maxmemory是bytes字節類型,注意轉換。修改如下所示:
# In short... if you have slaves attached it is suggested that you set a lowerlimit for maxmemory so that there is some free RAM on the system for slave
output buffers (but this is not needed if the policy is 'noeviction').
maxmemory <bytes>
maxmemory 268435456
轉載於:https://my.oschina.net/boonya/blog/3057697

