天天看點

Redis延遲監控架構

每個Redis執行個體經常被用于每時每刻都要提供大量查詢服務的場景,同時,對平均響應時間和最大響應延遲的要求都非常嚴格。

當Redis用作記憶體系統時,它以不同的方式與作業系統進行互動,例如,持久化資料到磁盤上。再者,Redis實作了豐富的指令集。大部分指令執行都很快,能在确定時間内或對數時間内完成(譯者注;對數時間是時間複雜度的一種),另外有些指令則是複雜度為O(N)的指令,會導緻延遲毛刺(latency spikes)。

最後,Redis是單線程的:以檢視單核處理量的觀點來看,單線程通常被認為是優點,并且能夠提供延遲的概況,但同時,從延遲本身的觀點來看,單線程也會帶來挑戰,因為單線程隻能逐個處理任務,例如,對key過期時間的處理,不會影響到其他用戶端。

綜上所慮,Redis 2.8.13引入延遲監控(Latency Monitoring)的新特性,幫助使用者檢查和排除可能的延遲問題。延遲監控由以下概念部分組成:

延遲鈎子(Latency hooks):檢測不同敏感度延遲的代碼路徑。

以不同僚件分隔的延遲毛刺的時間序列記錄。

報告引擎:從時間序列記錄中提取原始資料。

分析引擎:提供易懂的報表和按測量結果給出的提示。

不同監控代碼路徑有不同的名稱,并稱之為事件。例如,<code>command</code>是測量可能很慢的指令的執行延遲毛刺的事件,而<code>fast-command</code>則是監控時間複雜度為O(1)和O(log N)的指令的事件名稱。其他事件則不太通用,主要監控Redis執行的特殊操作。例如,<code>fork</code>事件僅僅監控Redis執行系統調用<code>fork(2)</code>所耗的時間。

延遲毛刺是指運作時間比配置的延遲閥值更長的事件。每個監控事件會關聯一個獨立的時間序列。下面說明時間序列如何工作的:

每次出現延遲毛刺,會記錄合适的時間序列

每個時間序列由160個元素組成

每個元素是一個值對:包含檢測到延遲毛刺出現時的unix時間戳和事件耗時的毫秒數

相同僚件在同一時刻出現多個延遲毛刺,将會被合并(取最大延遲),是以,即使給定事件被檢測到出現連續延遲毛刺,例如,由于使用者設定了非常低的延遲閥值,将隻會保留180秒的曆史記錄。

對于每一個元素記錄最大的延遲時間。

某種用例出現高延遲,對另外的用例可能不會出現高延遲。當一些應用的所有查詢的響應延遲都必須少于1毫秒時,而另一些應用的用戶端有很小比例出現2秒的延遲,這種情況是可以接受的。

是以,啟動延遲監控的第一步是以毫秒為機關設定延遲閥值(latency threshold)。僅當事件耗時超過指定的延遲閥值才會記錄延遲毛刺。使用者可根據需要來設定延遲閥值。例如,如果基于Redis的應用能接受的最大延遲是100毫秒,則延遲閥值應當設定為大于或等于100毫秒,以便記錄所有阻塞Redis伺服器的事件。

在生産伺服器上,通過下面的指令可以在運作時啟用延遲監控:

延遲監控預設是關閉狀态,即使延遲監控處理幾乎不耗時。然而,當延遲監控隻需非常小的記憶體時,則沒有必要為一個運作良好的Redis執行個體提高基線記憶體使用量(baseline memory usage)。

延遲監控子系統的使用者界面是<code>LATENCY</code>指令。像其他Redis指令一樣,<code>LATENCY</code>可以接收子指令來改變指令的行為。接下來的章節對各個子指令進行說明。

<code>LATENCY LATEST</code>指令會上報已記錄事件的最後一次延遲。每個事件包含以下字段:

事件名稱

事件出現延遲毛刺的Unix時間戳

最後事件延遲(機關:毫秒)

本事件的最大延遲(所有時間段)

最大事件延遲所指的所有時間段并不是指從Redis執行個體啟動以來,因為事件資料有可能會用稍後看到的<code>LATENCY RESET</code>指令來重置。

下面是輸出樣例:

<code>LATENCY HISTORY</code>指令從時間序列中提取原始資料時是非常有用的,資料是“時間戳-延遲”值對的形式。本指令會傳回給定事件的160個元素。應用程式可用提取的原始資料來實作性能監控和展示圖表等功能。

輸出樣例:

<code>LATENCY RESET</code>指令,若不帶參數,則重置所有事件,丢棄目前記錄的延遲毛刺事件并重置最大事件延遲的值。

通過指定事件名稱作為參數,可以重置指定的事件。該指令在執行期間,會傳回已被重置的事件時間序列的序号。

為指定事件生成字元畫(ASCII-art style graph):

字元畫每列下面的垂直标簽表示事件是多久之前發生的,可用秒、分鐘、小時或天來表示時間機關。例如,”15s”表示上圖中第1個圖形化的事件發生在15秒鐘之前。

圖形對最小值和最大值的圖例進行了規範化定義,即0表示最小值(即最低一行的下劃線),最高一行的#表示最大值。

graph子指令非常有用,能快速判斷指定事件的延遲趨勢,不需要使用額外的工具,也不需要解析<code>LATENCY HISTORY</code>指令提供的原始資料。

<code>LATENCY DOCTOR</code>指令是最強大的延遲監控分析工具,能提供更多統計資料,如延遲毛刺間的平均時間間隔,中值偏差和易懂的事件分析。對某些事件,如”fork”事件,會提供如系統建立程序的速率等更多的資訊。

如果想尋求延遲相關問題的幫助,應當把本指令的輸出内容發送到Redis郵件清單。

<code>LATENCY DOCTOR</code>指令目前尚不完善(原意:有精神病行為),是以,我們建議謹慎使用該指令。

本文作者:陳群

本文來自雲栖社群合作夥伴rediscn,了解相關資訊可以關注redis.cn網站。

繼續閱讀