天天最新:【Redis技術專區】「優化案例」談談使用Redis慢查詢日志以及Redis慢查詢分析指南

2023-01-24 17:23:54 來源:51CTO博客

前提介紹

本篇文章主要介紹了Redis的執行的慢查詢的功能的查詢和配置功能,從而可以方便我們在實際工作中,進行分析Redis的性能運行狀況以及對應的優化Redis性能的佐證和指標因素。

在我們5.0左右的版本中Redis使用單線程架構和I/O多路復用模型來實現高性能的內存數據服務。接下來主要分析Redis單線程命令處理機制,接著分析Redis單線程模型為什么性能如此之高。


(資料圖片僅供參考)

單線程命令的處理機制

Redis客戶端與服務端的模型主要是下圖所示。

每次客戶端調用都經歷了發送命令、執行命令、返回結果三個過程。

本章內容

本章的文章內容主要是一下幾點。

什么是慢查詢

慢查詢就是當Redis在處理一條指令的時候,當超過了系統配置的執行時間的閾值的時候,就會被系統當作慢查詢統計和判定。

慢查詢日志

慢查詢日志就是系統在命令執行前后計算每條命令的執行時間,當超過預設閾值,就將這條命令的相關信息(例如:發生時間、耗時、命令的詳細信息)記錄下來。

Redis慢查詢日志

Redis慢查詢日志功能是用于記錄執行時間超過給定時長的命令請求,可以通過查看慢查詢日志來監控和優化查詢速度。

Redis慢查詢的危害

說到了Redis慢查詢的危害,就會先說一下Redis的運行機制。

Redis客戶端執行一條命令的步驟

Redis是單線程來處理命令,所以一條命令從客戶端到達服務端不會立即被執行,所有的命令都會進入一個隊列,然后逐個被執行。

因此Redis服務端去執行操作的是可以主要以下幾個步驟:

所有的指令都有先后順序,但是真正意義到達服務端的執行順序也是不確定的,因為中間有網絡傳輸。但是可以肯定的是,不會有兩條命令被同時執行,這樣就不會產生并發問題,這就是Redis單線程的基本模型。

慢查詢引發的問題
單線程機制:所有命令放在一個隊列中Redis執行指令主要是在內存中執行、非IO阻塞、避免線程切換和競態產生的消耗。

因為單線程的問題,一個命令不能執行太長時間,不然會阻塞其他命令的執行。所以慢查詢會造成整體的Redis服務的性能的下降以及CPU的耗時和負載變高。

注意:慢查詢只會記錄執行命令的時間,沒有慢查詢并不代表客戶端沒有超時問題

閾值和慢查詢的日志的設置

監控Redis指令的慢查詢功能,需要明確兩件事:

預設閾值怎么設置?慢查詢記錄存放在哪里?
預設閾值怎么設置?

針對于慢查詢的閾值,在Redis提供了??slowlog-log-slower-than??和??slowlog-max-len??配置來解決這兩個問題。

閾值參數設置
慢查詢執行時間閾值
slowlog-log-slower-than:指定執行時間超過多少微秒的命令會被記錄到日志上,默認10000,它的單位是微妙。

例如,該值設為100,執行了一條很慢的命令(例如 keys * ),如果它的執行時間超過了100微秒,則這個命令會被記錄到慢查詢日志中。(1秒=1000毫秒=1000000微秒)

慢查詢數據存儲閾值

慢查詢日志最多存儲多少條,并沒有說明存放在那里?主要通過slowlog-max-len進行控制和設置。從底層角度分析,Redis使用了一個列表來存儲慢查詢日志,slowlog-max-log就是列表的最大長度。

slowlog-max-len:指定服務器上最多保存慢查詢日志的條數。slowlog-log-slower-than=0,那么系統會記錄所有的命令slowlog-log-slower-than<0,那么對任何命令都不會記錄。

例如,該值設為5,那么命令執行時間超過slowlog-log-slower-than設置的時間的命令會被記錄到慢查詢日志上,如果慢查詢日志的數量等于5,那么再添加慢查詢日志時,需要把最早添加的慢查詢日志刪除,即慢查詢日志刪除采用先進先出的方式。

慢查詢的配置類型和方式

Redis有兩種修改配置的方法:1. 修改配置文件;2. config set命令動態修改。

例如,使用config set命令將slowlog-log-slower-than設置為20000微秒,slowlog-max-len設置為10000:

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

如果要Redis將配置持久化到本地配置文件,要執行config rewrite命令,它會重寫配置文件。

慢查詢日志的操作命令

慢查詢日志的的查詢和維護主要是通過:slowlog get、slowlog len、slowlog reset這幾條命令。

slowlog get [n]

慢查詢日志有4個屬性組成:日志id、發生時間戳、命令耗時、執行命令和參數。

127.0.0.1:6379> slowlog get1) 1) (integer) 1   2) (integer) 1513709400   3) (integer) 11   4) 1) "slowlog"      2) "get"2) 1) (integer) 0   2) (integer) 1513709398   3) (integer) 4   4) 1) "config"      2) "set"      3) "slowlog-log-slower-than"      4) "2"
slowlog len

獲取慢查詢日志列表當前的長度

127.0.0.1:6379> slowlog len(integer) 2

上面則說明當前的滿查詢列表中至于連個慢查詢日志。

slowlog reset

實際是對慢查詢日志列表做清理操作。

127.0.0.1:6379> slowlog len(integer) 6127.0.0.1:6379> slowlog resetOK127.0.0.1:6379> slowlog len(integer) 1

為什么還有1個,因為閾值設的比較小,slowlog reset就屬于慢查詢。

標簽: 執行時間 配置文件 執行命令

上一篇:環球快報:一個Netflix開發的微服務編排引擎,支持可視化工作流定義
下一篇:天天速看:【學懂Java】(五)異常處理