深入理解Redis 延遲監(jiān)控的項目實踐
1 為什么需要內(nèi)建延遲監(jiān)控?
Redis 單線程+磁盤持久化+多種算法復雜度共存,一旦:
- 遇到 O(N) 大命令
- AOF fsync / fork 掛起主線程
- 大量 Key 同秒過期 / 主動淘汰
- 宿主機抖動,導致系統(tǒng)調(diào)用耗時飆升
就會讓所有客戶端排隊等待,出現(xiàn)毫秒到秒級 “雪崩”。
Latency Monitor 將這些 “卡點” 做成事件鉤子并存儲時間序列,讓你可精確回放 spike 發(fā)生的時刻與持續(xù)時間,配合 LATENCY DOCTOR 產(chǎn)出可讀結論。
2 事件模型與時間序列
| 事件名 | 監(jiān)控對象 | 典型根因 |
|---|---|---|
| command | 所有命令 | KEYS / ZINTERSTORE 等 O(N) 阻塞 |
| fast-command | O(1)/O(logN) 命令 | 基線抖動 |
| fork | fork() 復制頁表 | BGSAVE / BGREWRITEAOF |
| aof-write / aof-fsync-* | write() & fsync() | 磁盤 IO / 共振 |
| expire-cycle | 主動過期采樣 | 同批 EXPIREAT |
| eviction-* | 內(nèi)存淘汰 | 高頻淘汰、熱點 key 巨大 |
| active-defrag-cycle | 在線碎片整理 | 大碎片 + defrag aggressiveness |
記錄規(guī)則
- 每類事件獨立 160 個桶:(timestamp, cost_ms)
- 同 1 秒內(nèi)多次 spike 取 最大,保證最少 160 秒歷史
- 額外維護 “歷史最大值” 方便基準比較
3 一鍵啟用監(jiān)控
127.0.0.1:6379> CONFIG SET latency-monitor-threshold 100 # 只記錄 ≥100 ms OK
- 閾值 = SLA-可接受延遲。例如業(yè)務要求“單條 ≤80 ms”,閾值可設 50 ms,提前預警。
- 線上零成本;禁用只需
CONFIG SET latency-monitor-threshold 0。
4 LATENCY 指令族速查表
| 子命令 | 作用 | 常用姿勢 |
|---|---|---|
| LATEST | 輸出最近一次 spike 格式:[event ts cost] | Dashboard 抓最新高延遲項 |
| HISTORY <event> | 取整條時間序列 | 時序圖 / Promotheus Export |
| GRAPH <event> | 終端 ASCII 圖 | SSH 即時觀測 |
| RESET [event …] | 清空某事件歷史 | 回收內(nèi)存 / 做 A/B 測試 |
| DOCTOR | 智能診斷報告 | 快速定位+給出 tuning 建議 |
樣例:fork 事件圖
127.0.0.1:6379> LATENCY GRAPH fork
fork: (microseconds) % > (msec) 999th cummulative latency distribution 99.4% ██████████████████████████████████████████████████ 44 ... 100% ██████████████████████████████████████████████████ 68
5 實戰(zhàn)排障流程
5.1 高頻命令延遲
LATENCY LATEST 出現(xiàn) command > SLA
SLOWLOG GET 10 找具體指令
如果是
- SCAN 替代 KEYS
- 把大集合運算放到 Replica / 后臺腳本
- 引入 Lua + 分批寫,避免長事務
5.2 fork 卡頓
LATENCY GRAPH fork 有 50-500 ms 峰
INFO persistence 查看 latest_fork_usec
動作:
- 使用 HVM / 物理機、關閉 THP
- 大實例開啟
linux-readahead 0, 避免寫時極端 COW - 避開業(yè)務高峰做持久化/重寫
5.3 AOF fsync 峰值
aof-fsync-always or aof-write-pending-fsync spikes
解決:
- 改為
appendfsync everysec + no-appendfsync-on-rewrite yes - 獨立 NVMe 盤、開啟
direct-io - 若不要求秒級丟失,可用
appendfsync no+ 雙機熱備
5.4 過期/淘汰抖動
expire-cycle 抖高:大量 key 同時過期,做 TTL 隨機抖動
eviction-del 抖高:
- 優(yōu)化 maxmemory 策略 →
allkeys-lfu - 檢查是否有超大 value 導致單次 DEL 久
6 監(jiān)控 & 告警集成
# example: 導出為 Prometheus 指標
redis-cli --raw LATENCY LATEST \
| awk '{printf "redis_latency_spike{event=\"%s\"} %d\n", $1, $3}'
- 結合
redis_exporter可自動拉取LATENCY LATEST指標。 - 建議對以下事件配置告警:
command、fork、aof-fsync-always、expire-cycle。 - 觸發(fā)后自動執(zhí)行
LATENCY DOCTOR,郵件/釘釘輸出診斷。
7 總結 & 最佳實踐
- 閾值 = SLA 提前量,建議 TPS 高時 <1/2 SLA。
- 日常持續(xù)開
latency-monitor-threshold,日志輪轉保留 7-30 天。 - spike 首先看 事件類型→慢日志→系統(tǒng)調(diào)用 三步定位。
- fork 與 fsync 難免有抖動 → 減峰就靠 磁盤隔離 + 業(yè)務錯峰。
- 用
LATENCY RESET在每次調(diào)優(yōu)后清零,再觀測新曲線。
有了 Latency Monitor,你能把 Redis 從黑盒變成可觀測白盒 —— 慢在那里、卡多久、為何卡,一查便知,助你穩(wěn)穩(wěn)守住延遲紅線。祝線上永不宕,“毫”無壓力!
到此這篇關于深入理解Redis 延遲監(jiān)控的項目實踐的文章就介紹到這了,更多相關Redis 延遲監(jiān)控內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
redis執(zhí)行l(wèi)ua腳本的實現(xiàn)方法
redis在2.6推出了腳本功能,允許開發(fā)者使用Lua語言編寫腳本傳到redis中執(zhí)行。本文就介紹了redis執(zhí)行l(wèi)ua腳本的實現(xiàn)方法,感興趣的可以了解一下2021-11-11

