Redis On-CPU Profiling定位瓶頸到可視化火焰圖

1 . 前置檢查:確認 CPU 真的是瓶頸

在正式打性能“補丁”前,務必跑一遍系統級健康核對表(推薦 Brendan Greg 的 USE Method):

資源關注指標常用工具
CPUUtil/Idle、RunQueuetopvmstatsar
內存Fault、Swap、Cache Missfreeperf stat
I/OIOPS、Latency、Waitiostatpidstat -d
網絡PPS、Rtt、Dropifstatss

當你確認 Redis 主要耗時在 CPU on-cpu,再繼續以下步驟。

2 . 為可追蹤重新編譯 Redis

目標:既保留 -O2 優化獲得真實的生產時序,又保證棧幀可解析。

# 從 Redis 源碼根目錄編譯
make clean
make REDIS_CFLAGS="-g -fno-omit-frame-pointer"
  • -g??? : 保留調試符號,便于棧回溯
  • -fno-omit-frame-pointer : 強制保留 FP 寄存器
  • -O2???: 維持 Release 優化級別

3 . 熱點采樣(Hotspot Analysis)

3.1 使用 perf 采樣用戶態 + 內核態棧

# 60 s 內以 999 Hz 頻率采樣 redis-server 進程
perf record -g -F 999 --pid $(pgrep redis-server) -- sleep 60
分析報告
perf report -g "graph,0.5,caller"
  • graph?展示調用關系
  • 0.5? 截斷閾值(≥0.5 %)
  • caller 自上而下查看“誰調用了熱點函數”

3.2 使用 eBPF/BCC 的 profile 工具

內核 4.9+ 之后,BPF 方案可在內核空間折疊棧,再回寫到用戶態,極大降低開銷。

/usr/share/bcc/tools/profile -F 999 -f \--pid $(pgrep redis-server) --duration 60 > redis.folded.stacks

一步到位獲得 folded 格式(形如 main;call;dictFind 12),后續直接生成火焰圖。


4 . 可視化:生成交互式 Flame Graph

# perf 采樣
perf script > redis.perf.stacks
stackcollapse-perf.pl redis.perf.stacks > redis.folded.stacks# 或 bcc 已直接輸出 folded
flamegraph.pl redis.folded.stacks > redis.svg
  • 橫軸 = 調用棧聚合后 樣本占比
  • 縱軸 = 調用深度
  • 點擊 SVG 方塊可下鉆到更深層棧幀

5 . 調用頻次分析(Call Counts)

高 CPU 占用可能是 單次調用很慢,也可能是 調用極其頻繁。用 BCC 的 funccount 快速把函數調用次數統計出來:

/usr/share/bcc/tools/funccount 'redis-server:(call*|*Read*|*Write*)' \--pid $(pgrep redis-server) --duration 60

輸出示例:

FUNC                                         COUNT
call                                           334
handleClientsWithPendingWrites                 388
prepareClientToWrite                          1442

配合熱點棧信息,就能判斷該優化“減肥”還是“減次數”。

6 . 硬件事件采樣:PMCs 診斷失速

通過 perf stat 一次性拉齊真正的 CPU IPC、Cache Miss 與 Stall 周期。

perf stat -e \cpu-clock,cpu-cycles,instructions, \uops_executed.core,uops_executed.stall_cycles, \cache-references,cache-misses, \cycle_activity.stalls_l1d_miss,cycle_activity.stalls_l2_miss, \cycle_activity.stalls_l3_miss \--pid $(pgrep redis-server) -- sleep 60

關鍵指標解讀:

指標理想診斷思路
IPC (instructions / cycles)> 2(現代 x86)低則說明管線空轉或 Cache Miss
cache-miss / cache-ref< 3 %> 10 % 多半緩存友好度差
stall_cycles / cycles越低越好高說明 CPU 在等數據

7 . 一鍵腳本示例

下面腳本可把 采樣 + 折疊 + FlameGraph 合并執行,適合 CI / 回歸測試:

#!/usr/bin/env bash
PID=$(pgrep redis-server)
DUR=60
FREQ=999
OUT=/tmp/redis_$(date +%s)# 1) 采樣
perf record -g -F $FREQ --pid $PID -- sleep $DUR# 2) 轉棧
perf script > $OUT.stacks
stackcollapse-perf.pl $OUT.stacks > $OUT.folded# 3) 火焰圖
flamegraph.pl $OUT.folded > $OUT.svg
echo "🔥 FlameGraph ready: $OUT.svg"

8 . 生產環境落地建議

  1. 采樣頻率999 Hz 已覆蓋絕大多數業務;異常抖動場景可降到 199 Hz 減少開銷。
  2. 采樣窗口:確保覆蓋 GC、AOF rewrite、慢查詢 等高峰時段。
  3. 分段對比:升級或改代碼前后做 差分 FlameGraph,一眼看出新增/消失的熱點。
  4. 自動歸檔:用 perf-archive.sh + tar 保存 perf.data 與 Build-ID,方便異地復盤。
  5. 代碼熱補丁:熱點定位后,可先試 serverCrondictFind 等典型函數的算法或數據結構優化,再決定是否拆分 RDB、AOF 線程。

9 . 常見疑難解答

癥狀排查點
FlameGraph 棧幀只有不到兩層未加 -fno-omit-frame-pointer 或 strip 了 debug 符號
perf record 提示 “PERF_EVENT_OPEN failed”當前用戶無 CAP_SYS_ADMIN,用 sudo 或調整 kernel.perf_event_paranoid=-1
采樣時 Redis 延遲抖高頻率過大 / 容器 cgroup 受限,先用 eBPF profile 或降低采樣率
火焰圖找不到內核函數確保安裝 kernel-debuginfolinux-image-*-dbgsym

結語

  • perf + eBPF 解決“算在哪”的問題;
  • PMCs 解決“慢在哪”的問題;
  • 系統方法論 (USE / RED) 解決“該不該”的問題。

把三者串起來,就形成了 Redis CPU 優化的閉環:定位 → 可視化 → 改進 → 回歸

愿你下次再看火焰圖時,只為欣賞那條平穩而美麗的線!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87932.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87932.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87932.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

未來趨勢:AI與量子計算對服務器安全的影響

隨著技術的飛速發展&#xff0c;人工智能&#xff08;AI&#xff09;和量子計算正在深刻改變信息技術的各個領域。特別是在服務器安全領域&#xff0c;這兩項技術既帶來了新的可能性&#xff0c;也帶來了前所未有的挑戰。本文將探討AI和量子計算技術對服務器安全的影響&#xf…

markdown學習筆記(個人向) Part.1

markdown學習筆記&#xff08;個人向&#xff09; Part.1 1. 推薦插件 markdown&#xff1a; 安裝支持markdown的插件&#xff1b; markdown-preview-github-styles&#xff1a; 可以將VS Code上默認的markdown預覽樣式修改成github上常用的形式&#xff0c;很大程度上提高文件…

ZooKeeper 實現分布式鎖

1. 分布式鎖概述 在分布式系統中&#xff0c;為了保證共享資源在并發訪問下的數據一致性&#xff0c;需要引入分布式鎖。分布式鎖是一種在分布式環境下控制多個進程對共享資源進行互斥訪問的機制。它與單機環境下的鎖&#xff08;如Java中的synchronized或Lock&#xff09;不同…

Linux線程——基礎全解

一、什么是線程&#xff08;Thread&#xff09;&#xff1f;? 定義&#xff1a;線程是程序執行的最小單位。即線程&#xff08;Thread&#xff09;是操作系統能夠進行運算調度的最小單位&#xff0c;它被包含在進程之中&#xff0c;是進程中的實際運作單位。一個進程可以并發多…

Java基礎--封裝+static

目錄 什么是封裝&#xff1f; 什么是訪問限定符&#xff1f; static靜態修飾符 用static修飾的類變量或類方法的注意事項&#xff1a; 什么是封裝&#xff1f; 封裝是面向對象的三大特性之一&#xff0c;指的是將一個類中的實現細節進行隱藏&#xff0c;對外只提供一些開放…

DAY 51 復習日

作業&#xff1a;day43的時候我們安排大家對自己找的數據集用簡單cnn訓練&#xff0c;現在可以嘗試下借助這幾天的知識來實現精度的進一步提高import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as trans…

針對網絡爬蟲的相關法律法規整理

在中國&#xff0c;網絡爬蟲的法律法規涉及多個層面&#xff0c;包括個人信息保護、數據安全、網絡安全、知識產權、反不正當競爭等。以下是詳細的法律法規分析及合規指南&#xff1a; 1. 核心法律法規及適用場景? ??&#xff08;1&#xff09;《民法典》——隱私權與個人信…

1.1_5_2 計算機網絡的性能指標(下)

繼續來看計算機網絡的性能指標&#xff0c;接下來我們探討時延&#xff0c;時延帶寬積和往返時延&#xff0c;以及信道利用率這幾個性能指標。 首先來看時延這個性能指標&#xff0c;英文叫delay&#xff0c;也有的教材&#xff0c;把它翻譯為延遲。所謂的時延&#xff0c;就是…

PP-OCRv2:超輕OCR系統的萬能包

PP-OCRv2&#xff1a;超輕OCR系統的萬能包摘要光學字符識別&#xff08;OCR&#xff09;系統已廣泛應用于多種場景&#xff0c;但設計兼顧精度與效率的OCR系統仍具挑戰性。我們此前提出的超輕量OCR系統PP-OCR在平衡兩者方面取得進展。本文進一步提出PP-OCRv2&#xff0c;通過五…

常見的軟件版本開源協議

開源軟件許可證核心指南 一、許可證基礎分類 1. 寬松型許可證&#xff08;Permissive&#xff09; 核心特征&#xff1a;允許閉源衍生&#xff0c;僅保留版權聲明適用場景&#xff1a;商業集成、快速開發代表協議&#xff1a; &#x1f4dc; MIT &#x1f4dc; Apache 2.0 &…

基于FPGA的一維序列三次樣條插值算法verilog實現,包含testbench

目錄 1.前言 2.算法運行效果圖預覽 3.算法運行軟件版本 4.部分核心程序 5.算法仿真參數 6.算法理論概述 7.參考文獻 8.算法完整程序工程 1.前言 三次樣條插值是一種在數據擬合和信號處理中廣泛應用的技術&#xff0c;它通過構造分段三次多項式來逼近給定的離散數據點&a…

RAG 之 Prompt 動態選擇的三種方式

“如果我有5個prompt模板&#xff0c;我想只選擇一個每次都自動五選一能做到嗎怎么做&#xff1f;” 完全可以做到。這在復雜的RAG或Agentic工作流中是一個非常普遍且關鍵的需求&#xff0c;通常被稱為“條件路由&#xff08;Conditional Routing&#xff09;”或“動態調度&am…

【ROS2 自動駕駛學習】02-安裝ROS2及其配套工具

目錄 一、設置語言環境 二、添加存儲庫 三、添加軟件源 四、安裝ROS2 五、配置環境 六、測試ROS2 七、安裝一些工具 7.1 terminator 7.2 colcon工具 7.3 tf工具 7.4 joint-state-publisher工具 7.5 urdf 八、安裝三方庫 8.1 Eigen 8.2 yaml-cpp 8.3 matplotl…

系統學習Python——并發模型和異步編程:基礎知識

分類目錄&#xff1a;《系統學習Python》總目錄 并行是并發的一種特殊情況。**所有并行系統都是并發的&#xff0c;但不是所有并發系統都是并行的。**在21世紀初&#xff0c;我們可以使用單核設備在GNU Linux上同時處理100個進程。一臺擁有4個CPU核的現代筆記本計算機&#xff…

睿爾曼系列機器人——以創新驅動未來,重塑智能協作新生態(下)

在智能制造與人工智能深度融合的當下&#xff0c;機器人技術正經歷從 “功能替代” 到 “價值共創” 的深刻躍遷。睿爾曼&#xff0c;作為全球超輕量仿人機械臂領域的先行者&#xff0c;始終秉持 “讓機器人觸手可及” 的使命&#xff0c;憑借底層技術的突破性進展&#xff0c;…

表征工程(Representation Engineering, RepE)

表征工程(Representation Engineering, RepE) 近年來,表征工程(Representation Engineering, RepE)在提升AI系統透明度和可控性方面取得了顯著進展。 一、大模型可解釋性與可控性的突破 核心論文:《Representation Engineering: A Top-Down Approach to AI Transparen…

國產ARM+FPGA工業開發平臺——GM-3568JHF

一、引言 隨著物聯網和國產替代需求的快速發展&#xff0c;嵌入式系統面臨計算性能與硬件靈活性的雙重挑戰。GM-3568JHF開發板基于國產“ARMFPGA”異構架構&#xff0c;結合瑞芯微RK3568J處理器與紫光同創Logos-2 FPGA芯片&#xff0c;支持國產自主操作系統&#xff0c;滿足通…

RISCV Linux 虛擬內存精講系列一 Sv39

筆者認為&#xff0c;Linux 操作系統&#xff08;Operating System&#xff09;最核心的機制是虛擬內存&#xff08;Virtual Memory&#xff09;。因為&#xff0c;操作系統主要作用是將硬件環境抽象起來&#xff0c;給在其中運行的應用&#xff08;Applications&#xff09;提…

【apply from: “$flutterRoot/packages/flutter_tools/gradle/flutter.gradle“作用】

這行代碼的作用是將 Flutter 的 Gradle 構建腳本集成到 Android 項目中&#xff0c;具體細節如下&#xff1a;作用解析&#xff1a;引入 Flutter 構建邏輯 flutter.gradle 是 Flutter SDK 的核心構建腳本&#xff0c;它負責&#xff1a; 編譯 Dart 代碼為原生二進制文件&#x…

深入理解JavaScript設計模式之命令模式

深入理解JavaScript設計模式之命令模式 文章目錄深入理解JavaScript設計模式之命令模式定義簡單命令模式組合命令模式使用命令模式實現文本編輯器目標關鍵類說明實現的效果交互邏輯流程所有代碼&#xff1a;總結定義 命令模式也是設計模式種相對于變焦簡單容易理解的一種設計模…