Redis幾個重要的健康指標
存活情況
所有指標中最重要的當然是檢查redis是否還活著,可以通過命令PING的響應是否是PONG來判斷。
連線數
連線的客戶端數量,可通過命令src/redis-cli info Clients|
grep connected_clients得到,這個值跟使用redis的服務的連線池配置關係比較大,所以在監控這個欄位的值時需要注意。另外這個值也不能太大,建議不要超過5000,如果太大可能是redis處理太慢,那麼需要排除問題找出原因。
另外還有一個拒絕連線數(rejected_connections)也需要關注,這個值理想狀態是0。如果大於0,說明建立的連線數超過了maxclients,需要排查原因。是redis連線池配置不合理還是連線這個redis例項的服務過多等。
阻塞客戶端數量
blocked_clients,一般是執行了list資料型別的BLPOP或者BRPOP命令引起的,可通過命令src/redis-cli info Clients|
grep blocked_clients得到,很明顯,這個值最好應該為0。
使用記憶體峰值
監控redis使用記憶體的峰值,我們都知道Redis可以通過命令config set maxmemory 10737418240
設定允許使用的最大記憶體(強烈建議不要超過20G),為了防止發生swap導致Redis效能驟降,甚至由於使用記憶體超標導致被系統kill,建議used_memory_peak的值與maxmemory的值有個安全區間,例如1G,那麼used_memory_peak的值不能超過9663676416(9G)。另外,我們還可以監控maxmemory不能少於多少G,比如5G。因為我們以前生產環境出過這樣的問題,運維不小心把10G配置成了1G,從而導致伺服器有足夠記憶體卻不能使用的悲劇。
記憶體碎片率
mem_fragmentation_ratio=used_memory_rss/used_memory,這也是一個非常需要關心的指標。如果是redis4.0之前的版本,這個問題除了重啟也沒什麼很好的優化辦法。而redis4.0有一個主要特性就是優化記憶體碎片率問題(Memory de-fragmentation)。在redis.conf配置檔案中有介紹即ACTIVE DEFRAGMENTATION:碎片整理允許Redis壓縮記憶體空間,從而回收記憶體。這個特性預設是關閉的,可以通過命令CONFIG SET activedefrag yes
熱啟動這個特性。
- 當這個值大於1時,表示分配的記憶體超過實際使用的記憶體,數值越大,碎片率越嚴重。
- 當這個值小於1時,表示發生了swap,即可用記憶體不夠。
另外需要注意的是,當記憶體使用量(used_memory)很小的時候,這個值參考價值不大。所以,建議used_memory至少1G以上才考慮對記憶體碎片率進行監控。
快取命中率
keyspace_misses/keyspace_hits這兩個指標用來統計快取的命令率,keyspace_misses指未命中次數,keyspace_hits表示命中次數。keyspace_hits/(keyspace_hits+keyspace_misses)就是快取命中率。視情況而定,建議0.9以上,即快取命中率要超過90%。如果快取命中率過低,那麼要排查對快取的用法是否有問題!
OPS
instantaneous_ops_per_sec這個指標表示快取的OPS,如果業務比較平穩,那麼這個值也不會波動很大,不過國內的業務比較特性,如果不是全球化的產品,夜間是基本上沒有什麼訪問量的,所以這個欄位的監控要結合自己的具體業務,不同時間段波動範圍可能有所不同。
持久化
rdb_last_bgsave_status/aof_last_bgrewrite_status,即最近一次或者說最後一次RDB/AOF持久化是否有問題,這兩個值都應該是”ok”。
另外,由於redis持久化時會fork子程序,且fork是一個完全阻塞的過程,所以可以監控fork耗時即latest_fork_usec,單位是微妙,如果這個值比較大會影響業務,甚至出現timeout。
失效KEY
如果把Redis當快取使用,那麼建議所有的key都設定了expire屬性,通過命令src/redis-cli info Keyspace得到每個db中key的數量和設定了expire屬性的key的屬性,且expires需要等於keys:
# Keyspace db0:keys=30,expires=30,avg_ttl=0 db0:keys=23,expires=22,avg_ttl=0
慢日誌
通過命令slowlog get
得到Redis執行的slowlog集合,理想情況下,slowlog集合應該為空,即沒有任何慢日誌,不過,有時候由於網路波動等原因造成set key value
這種命令執行也需要幾毫秒,在監控的時候我們需要注意,而不能看到slowlog就想著去優化,簡單的set/get可能也會出現在slowlog中。
要檢視 slow log ,可以使用 SLOWLOG GET 或者 SLOWLOG GET number 命令,前者列印所有 slow log ,最大長度取決於 slowlog-max-len 選項的值,而 SLOWLOG GET number 則只打印指定數量的日誌。
redis> SLOWLOG GET 1) 1) (integer) 12# 唯一性(unique)的日誌識別符號 2) (integer) 1324097834# 被記錄命令的執行時間點,以 UNIX 時間戳格式表示 3) (integer) 16# 查詢執行時間,以微秒為單位 4) 1) "CONFIG"# 執行的命令,以陣列的形式排列 2) "GET"# 這裡完整的命令是 CONFIG GET slowlog-log-slower-than 3) "slowlog-log-slower-than" 2) 1) (integer) 11 2) (integer) 1324097825 3) (integer) 42 4) 1) "CONFIG" 2) "GET" 3) "*" 3) 1) (integer) 10 2) (integer) 1324097820 3) (integer) 11 4) 1) "CONFIG" 2) "GET" 3) "slowlog-log-slower-than" ...
作者:阿飛
連結:https://www.jianshu.com/p/378bc1fcc7f4
版權歸作者所有,轉載請註明出處