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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;总结定义 命令模式也是设计模式种相对于变焦简单容易理解的一种设计模…