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

