天天看點

Redis:16---常用功能之(慢查詢日志)

一、慢查詢日志介紹

  • 許多存儲系統(例如MySQL)提供慢查詢日志幫助開發和運維人員定位系統存在的慢操作。所謂慢查詢日志就是系統在指令執行前後計算每條指令的執行時間,當超過預設閥值,就将這條指令的相關資訊記錄下來,Redis也提供了類似的功能
  • Redis的慢查詢日志功能用于記錄執行時間超過給定時長的指令請求,使用者可以通過這個功能産生的日志來監視和優化查詢速度
  • 用戶端指令執行步驟一般分為4步:發送指令、指令排隊、指令執行、傳回結果。慢查詢隻統計指令執行的時間的時間,是以沒有慢查詢并不代表客 戶端沒有逾時問題

二、慢查詢的兩個配置參數

  • slowlog-log-slower-than選項:指定執行時間超過多少微秒(1秒等于1000 000微秒)的指令請求會被記錄到日志上
  • 舉個例子,如果這個選項的值為100,那麼執行時間超過100微秒的指令就會被記錄到慢查詢日志
  • 提示:如果slowlog-log-slower-than=0會記錄所有的指令,slowlog-log-slowerthan<0對于任何指令都不會進行記錄
  • slowlog-max-len選項:指定伺服器最多儲存多少條慢查詢日志

慢查詢日志數量的溢出

  • Redis使用了一個清單來存儲慢查詢日志,伺服器使用先進先出的方式儲存多條慢查詢日志,當伺服器存儲的慢查詢日志數量等于slowlog-max-len選項的值時,伺服器在添加一條新的慢查詢日志之前,會先将最舊的一條慢查詢日志删除
  • 舉個例子,如果伺服器slowlog-max-len的值為100,并且假設伺服器已經儲存了100條慢查詢日志,那麼如果伺服器打算添加一條新日志的話,它就必須先删除目前儲存的最舊的那條日志,然後再添加新日志

配置參數的設定

  • 可以使用CONFIG指令設定配置參數的值
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite      
  • 如果要Redis将配置持久化到本地配置檔案,需要執行config rewrite指令

三、慢查詢日志的格式

  • 以下面的圖檔為例:
  • 1)日志的唯一辨別符
  • 2)指令執行時的UNIX時間戳
  • 3)指令執行的時常(機關微秒)
  • 4)指令以及指令參數
  • 5)指令執行的用戶端IP與端口

四、SLOWLOG指令

  • SLOWLOG GET:用來檢視伺服器所儲存的慢查詢日志
  • SLOWLOG RESET:用于清空所有慢查詢日志
  • SLOWLOG LEN:查詢慢查詢日志的數量

SLOWLOG GET示範案例

  • 首先使用CONFIG SET指令将伺服器slowlog-log-slower-than選項設定為0,那麼每條執行的指令都會被記錄到慢查詢日志
  • 然後再使用CONFIG SET指令将slowlog-max-len選項設定為5,那麼伺服器最多隻能儲存5條慢查詢日志
  • 接下來執行3條指令
  • 記着查詢慢查詢日志,可以看到上面我們執行的5條指令

五、最佳實踐

  • 慢查詢功能可以有效地幫助我們找到Redis可能存在的瓶頸,但在實際使用過程中要注意以下幾點:
  • slowlog-max-len配置建議:線上建議調大慢查詢清單,記錄慢查詢時 Redis會對長指令做截斷操作,并不會占用大量記憶體。增大慢查詢清單可以 減緩慢查詢被剔除的可能,例如線上可設定為1000以上。
  • slowlog-log-slower-than配置建議:預設值超過10毫秒判定為慢查詢, 需要根據Redis并發量調整該值。由于Redis采用單線程響應指令,對于高流 量的場景,如果指令執行時間在1毫秒以上,那麼Redis最多可支撐OPS不到 1000。是以對于高OPS場景的Redis建議設定為1毫秒
  • 慢查詢隻記錄指令執行時間,并不包括指令排隊和網絡傳輸時間。因 此用戶端執行指令的時間會大于指令實際執行時間。因為指令執行排隊機 制,慢查詢會導緻其他指令級聯阻塞,是以當用戶端出現請求逾時,需要檢 查該時間點是否有對應的慢查詢,進而分析出是否為慢查詢導緻的指令級聯 阻塞
  • 由于慢查詢日志是一個先進先出的隊列,也就是說如果慢查詢比較多的情況下,可能會丢失部分慢查詢指令,為了防止這種情況發生,可以定期 執行slow get指令将慢查詢日志持久化到其他存儲中(例如MySQL),然後 可以制作可視化界面進行查詢,後面文章介紹的Redis私有雲CacheCloud提供了這樣的功能,好的工具可以讓問題排查事半功倍