Redis高級功能之慢查詢日誌

Redis高級功能 - 慢查詢日誌

Redis提供了5種數據結構,但除此之外,Redis還提供了注入慢查詢分析,Redis ShellPipeline、事務、與Lua腳本、BitmapsHyperLogLogPubSubGEO等附加功能,這些功能可以在某些場景發揮很重要的作用.

 

慢查詢分析


許多存儲系統(如:MySQL)提供慢查詢日誌幫助開發與運維人員定位系統存在的慢操作.所謂慢查詢日誌就是系統在命令執行前後計算每條命令的執行時間,當超過預設閾值,就將這條命令的相關信息(例如:發生時間,耗時,命令的詳細信息)記錄到慢查詢日誌中,Redis也提供了類似的功能。

Redis命令執行流程:

redis命令執行流程

1.發送命令

2.命令排隊

3.命令執行

4.返回結果

需要注意,慢查詢只統計步驟3的時間,所以沒有慢查詢並不代表客戶端沒有超時問題。

1) 慢查詢的兩個配置參數

對於慢查詢功能,需要明確兩件事:

  • 預設閾值怎麼設置?

  • 慢查詢記錄存放在那?

Redis提供了slowlog-log-slower-thanslowlog-max-len配置來解決這兩個問題.從字面意思就可以看出,slowlog-log-slower-than就是這個預設閾值,它的單位是毫秒(1秒=1000000微秒)默認值是10000,假如執行了一條"很慢"的命令(例如key *),如果執行時間超過10000微秒,那麼它將被記錄在慢查詢日誌中。

如果slowlog-log-slower-than=0會記錄所有命令,slowlog-log-slower-than<0對於任何命令都不會進行記錄.

從字面意思看,slowlog-max-len只是說明了慢查詢日誌最多存儲多少條,並沒有說明存放在哪裏?實際上Redis使用了一個列表來存儲慢查詢日誌,slowlog-max-len就是列表的最大長度.一個新的命令滿足慢查詢條件時被插入到這個列表中,當慢查詢日誌列表已處於其最大長度時,最早插入的一個命令將從列表中移出,例如slowlog-max-len設置長度爲64.當有第65條慢查詢日誌插入的話,那麼隊頭的第一條數據就出列,第65條慢查詢就會入列.

Redis中有兩種修改配置的方法,一種是修改配置文件,另一種是使用config set命令動態修改.例如下面使用config set命令將slowlog-log-slower-than設置爲20000微妙.slowlog-max-len設置爲1024:

    config set slowlog-log-slower-than 20000
    config set slowlog-max-len 1024
    config rewrite

如果需要將Redis將配置持久化到本地配置文件,要執行config rewrite命令.如下:

"config set"同步到配置文件

雖然慢查詢日誌存放在Redis內存列表中,但是Redis並沒有暴露這個列表的鍵,而是通過一組命令來實現對慢查詢日誌的訪問和管理.

(1) 獲取慢查詢日誌

slowlog get [n]

參數n可以指定條數.

例:

    127.0.0.1:6370> slowlog get
    1) 1) (integer) 666
       2) (integer) 1456786500
       3) (integer) 11615
       4) 1) "BGREWRITEAOF"
    2) 1) (integer) 665
       2) (integer) 1456718400
       3) (integer) 12006
       4) 1) "SETEX"
          2) "video_info_200"
          3) "300"
          4) "2"
...

 

可以看到每個查詢日誌有4個屬性組成,分別是慢查詢日誌的表示id、發生時間戳、命令耗時、執行命令和參數,慢查詢列表:

慢查詢列表

(2) 獲取慢查詢日誌列表當前長度

slowlog len

例如,當前Redis中有45條慢查詢:

    127.0.0.1:6370> slowlog len
    (integer) 23

(3) 慢查詢日誌重置

slowlog reset

實際是對列表做清理操作,例如: 

    127.0.0.1:6370> slowlog len
    (integer) 23
    127.0.0.1:6370> slowlog reset
    OK
    127.0.0.1:6370> slowlog len
    (integer) 0

 

 2) 實踐

慢查詢功能可以有效地幫助我們找到Redis可能存在的瓶頸,但在實際使用過程中要注意以下幾點:

  • slowlog-max-len:線上建議調大慢查詢列表,記錄慢查詢時Redis會對長命令做階段操作,並不會佔用大量內存.增大慢查詢列表可以減緩慢查詢被剔除的可能,例如線上可設置爲1000以上.

  • slowlog-log-slower-than:默認值超過10毫秒判定爲慢查詢,需要根據Redis併發量調整該值.由於Redis採用單線程相應命令,對於高流量的場景,如果命令執行時間超過1毫秒以上,那麼Redis最多可支撐OPS不到1000因此對於高OPS場景下的Redis建議設置爲1毫秒.

  • 慢查詢只記錄命令的執行時間,並不包括命令排隊和網絡傳輸時間.因此客戶端執行命令的時間會大於命令的實際執行時間.因爲命令執行排隊機制,慢查詢會導致其他命令級聯阻塞,因此客戶端出現請求超時時,需要檢查該時間點是否有對應的慢查詢,從而分析是否爲慢查詢導致的命令級聯阻塞.

  • 由於慢查詢日誌是一個先進先出的隊列,也就是說如果慢查詢比較多的情況下,可能會丟失部分慢查詢命令,爲了防止這種情況發生,可以定期執行slowlog get命令將慢查詢日誌持久化到其他存儲中(例如:MySQLElasticSearch等),然後可以通過可視化工具進行查詢.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章