Redis 延遲監(jiān)控框架
Redis 2.8.13 引入了Latency Monitoring的一個(gè)新功能,可以幫助我們檢查和排查引起延遲的原因。
Latecny Monitoring 由如下組成:
Latency hooks: 采樣不同敏感度延遲的代碼路徑(也稱作事件);
時(shí)間序列:記錄不同事件的延遲峰值(也叫延遲尖峰)彬呻;
報(bào)表引擎:從時(shí)間序列獲取原始數(shù)據(jù)缠诅;
分析引擎:根據(jù)測(cè)量提供可讀的報(bào)告和提示。
事件和時(shí)間序列
把監(jiān)控代碼路徑稱之為事件案铺。例如:command 是一個(gè)測(cè)量可能較慢命令執(zhí)行的延遲峰值的事件,fast-command 則是監(jiān)控時(shí)間復(fù)雜度為O(1)和O(logN)的命令的事件梆靖。事件不是通用的控汉,用來(lái)監(jiān)控Redis執(zhí)行的特殊操作。例如返吻,fork事件只監(jiān)控系統(tǒng)調(diào)用fork(2) 所消耗的時(shí)間姑子。(寫RDB文件和rewrite AOF文件都需要fork出一個(gè)后臺(tái)進(jìn)程,fork操作的主要消耗在于頁(yè)表的拷貝思喊,不同系統(tǒng)的耗時(shí)會(huì)有些差異壁酬。其中,Xen問(wèn)題比較嚴(yán)重恨课。)
延遲峰值(尖峰) 是指運(yùn)行時(shí)間超過(guò)latency-monitor-threshold 配置的閾值的事件舆乔。每個(gè)監(jiān)控事件會(huì)關(guān)聯(lián)一個(gè)獨(dú)立的時(shí)間序列,時(shí)間序列工作的原理:
每次出現(xiàn)峰值(尖峰)時(shí)剂公,都會(huì)記錄在合適的時(shí)間序列希俩;
每個(gè)時(shí)間序列由160個(gè)元素組成;
每個(gè)元素都是一個(gè)值對(duì):包含檢測(cè)到延遲峰值(尖峰)出現(xiàn)時(shí)的unix 時(shí)間戳和事件執(zhí)行的毫秒數(shù)纲辽;
相同事件在同一時(shí)間出現(xiàn)將并合并(取最大值)颜武,因此,即使給定事件被檢測(cè)到連續(xù)峰值(尖峰)拖吼,如果用戶設(shè)置了比較低的閾值鳞上,將至少保留180s的歷史記錄;
-
對(duì)于每個(gè)元素吊档,記錄最大的延遲時(shí)間篙议。
查看Redis 源碼,可以歸類監(jiān)控事件的分類:
事件 | 事件內(nèi)容 | 命令 | 詳解 |
---|---|---|---|
command | 慢命令 | latency history command | 執(zhí)行時(shí)長(zhǎng)超過(guò) latency-monitor-threshold閾值的慢命令 |
fast-command | 時(shí)間復(fù)雜度為O(1)和O(logN)的命令 | latency history fast-command | 時(shí)間復(fù)雜度為O(1)和O(logN)的命令 |
fork | 系統(tǒng)調(diào)用fork(2) | latency history fork | AOF 或RDB 子進(jìn)程 |
... 未完待續(xù)