《Redis開發與運維》慢查詢分析 讀書筆記

搬磚大叔發表於2019-01-13

慢查詢日誌就是系統在命令執行前後計算每條命令的執行時間,當超過了設定的閥值,就將這條命令的資訊(發生時間、耗時、命令詳細資訊等)記錄下來。

客戶端命令執行生命週期

  Redis的客戶端分為四個部分,如下圖所示:

在這裡插入圖片描述

  • 傳送命令
  • 命令排隊
  • 命令執行
  • 返回結果

注意:慢查詢只統計命令執行時間,所以沒有慢查詢並不代表客戶端沒有超時問題。

慢查詢引數配置

  • slowlog-log-slower-than

  slowlog-log-slower-than 是預設閥值,單位微妙(預設10000),如果有一條命令的執行時間超過了 10000 微妙那麼這條命令將被記錄在慢查詢日誌中。   提示:如果 slowlog-log-slower-than = 0 會記錄所有命令,如果 slowlog-log-slower-than < 0 任何命令都不會記錄。

  • slowlog-max-than

  slowlog-max-than 說明慢查詢日誌最多儲存多少條記錄,並沒有說明儲存在哪個位置?在 Redis 中使用了一個列表來儲存慢查詢日誌,slowlog-max-than 就是列表的最大長度。一個命令如果滿足慢查詢的條件,就會將這條命令插入到列表中。   提示:當慢查詢日誌列表已處於最大長度時,最早插入的一個命令將從列表中移除。

  • 使用 config set 命令動態修改配置
### 修改閥值和設定列表最大長度
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
### 將配置持久化到本地檔案
config rewrite
複製程式碼
  • 獲取慢查詢日誌
###  n 可以指定條數
slowlog get \[n\]
複製程式碼
  • 慢查詢日誌資料結構   每一個慢查詢日誌由 4 個屬性組成,分別是慢查詢日誌的標識 id、發生時間戳、命令耗時、執行命令和引數。如下圖所示:

    在這裡插入圖片描述

  • 獲取慢查詢日誌列表長度

slowlog len
複製程式碼
  • 慢查詢日誌重置
slowlog reset
複製程式碼

慢查詢使用建議

  • slowlog-max-len:線上調大慢查詢列表,記錄慢查詢時 Redis 會對長命令做截斷操作,並不會佔用大量記憶體。增大慢查詢列表可以減緩慢查詢被剔除的可能性。
  • slowlog-log-slower-than:建議超過10毫秒判定為慢查詢,需要根據 Redis 併發量調整該值。對於高流量場景,如果命令執行在1毫秒以上,那麼 Redis 最多可支撐 OPS 不到1000。所以對於高 OPS 場景建議設定為1毫秒。
  • 慢查詢只記錄命令時間,因此客戶端執行命令的時間會大於命令實際執行時間。因為命令執行排隊機制,慢查詢會導致其它命令級聯阻塞,所以在出現請求超時情況下需要檢查該時間點會不會出現慢查詢,從而分析是否為慢查詢導致的級聯阻塞。
  • 在慢查詢比較多的情況下,可能會丟失部分慢查詢命令,為了防止丟失部分慢查詢命令可以定期執行 slow get 命令將慢查詢日誌持久化到其它儲存中(例如 MySQL),然後製作視覺化介面進行查詢。

相關文章