慢查詢日誌就是系統在命令執行前後計算每條命令的執行時間,當超過了設定的閥值,就將這條命令的資訊(發生時間、耗時、命令詳細資訊等)記錄下來。
客戶端命令執行生命週期
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),然後製作視覺化介面進行查詢。