惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
Spread Privacy
Spread Privacy
D
Docker
Stack Overflow Blog
Stack Overflow Blog
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
F
Full Disclosure
美团技术团队
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
Security Latest
Security Latest
C
Check Point Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
罗磊的独立博客
A
Arctic Wolf
S
Schneier on Security
T
Threatpost
C
CERT Recently Published Vulnerability Notes
L
LangChain Blog
博客园 - 叶小钗
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 聂微东
T
The Exploit Database - CXSecurity.com
W
WeLiveSecurity
Engineering at Meta
Engineering at Meta
C
Cybersecurity and Infrastructure Security Agency CISA
GbyAI
GbyAI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
H
Heimdal Security Blog
L
LINUX DO - 热门话题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
O
OpenAI News
G
GRAHAM CLULEY
M
MIT News - Artificial intelligence
S
Security @ Cisco Blogs
博客园 - 司徒正美
N
News and Events Feed by Topic
Microsoft Azure Blog
Microsoft Azure Blog
Cisco Talos Blog
Cisco Talos Blog
P
Palo Alto Networks Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Schneier on Security
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
月光博客
月光博客
The Last Watchdog
The Last Watchdog
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
C
Cisco Blogs
雷峰网
雷峰网

Nemo

再见,2025 Complete ORB-SLAM3 Setup Guide for Jetson Xavier NX with RealSense D455 20250723 再见,2024 Using CertBot for Automatic Secure EMQX Broker Create Your Own GPS Data Publisher Support SSL AGV Dispatching System Technical Documentation Finding Nemo No title 香港賽馬會呈獻系列:黑白——攝影敘事 再见,2023 团团是只猫 Design an FSM for Robot State Machines – Basics of Computer Science Data-driven robot lifespan: Collection 数据驱动的机器人寿命:收集、诊断、预测 Exploring the design space of binary search trees 特首来了 Large language models, explained with a minimum of math and jargon 设计有缓存异步逻辑的监控脚本并测试其资源占用 使用loguru记录串口数据并使用Docker搭建ARM开发环境 在vscode的Dev Container中构建.NET开发环境及使用doxygen和graphviz绘制函数调用图 State or Status? A*算法两种时间复杂度 /A* Algorithm: Two Types of Time Complexity 使用KD-Tree快速收敛到最近坐标点/Fast convergence to the nearest coordinate point using KD-Tree 翻译 || 总结 - Go语言中的空结构体(The empty struct) 再见,2022 从PE工作报告中能读出什么 Give me miles, give me truth AMR调度系统性能优化/AMR Dispatch System Performance Optimization 条件触发AMR避让流程/Conditionally triggered AMR avoidance process Docker实现调度系统整体部署/Docker implementation of dispatching system overall deployment 调度系统中加密算法的使用/增加SM4补0方法/Use of encryption algorithms in scheduling systems/add SM4 complementary 0 method 一篇关于北京四天三夜的攻略 2022 藏疆自驾 策划/招募书 AMR仿真模型/AMR Simulation Model 东东有鱼2022年会分享 Beyond Compare 4删除试用 你的灵魂有香气 Pyinstaller打包Python项目 [转载]Python中的单例模式的几种实现方式的及优化 - Nemo 再见! 2020 1024 UML软件建模 入职优必选一个月 写论文时 那些让你开心的软件 - Nemo 分享一个记录刷题次数的模版 LeetCode-查找表类算法题精析 PyCharm 调用vs 2010 C++库导致提示报错R6034解决方法 MySQL基础教程 多种数据结构的Python实现形式 字节跳动-挑战字符串 选择排序 二分查找和大O表示法 算法中的动态规划问题 高高手课程-青山裕企人像摄影 笔记(内含福利)
使用perf-FlameGraph监控系统性能
Nemo · 2022-02-09 · via Nemo

背景

根据帕累托法则,只有优化处于性能瓶颈的那些少量代码,才能用最小的成本获得最大的收益。

单机系统中有一种最直接有效的方式,就是从代码层面直接寻找调用次数最频繁、耗时最长的函数,通常它就是性能瓶颈。但达到这个目标需要三个约束条件:

  1. 没有代码侵入性。比如,在函数执行的前后,分别打印一行日志记录时间,这当然能获取到函数的调用频次和执行时长,但并不可取,它的开发、维护成本太高了。
  2. 覆盖到代码中的全部函数。如果只是监控事先猜测的、有限的几个函数,往往会因为思维死角,遗漏掉真正的瓶颈函数。因此,只有监控所有函数的执行情况,并以一种全局的、直观的方式分析聚合后的监控结果,才能快速、准确地找到性能瓶颈。
  3. 搭建环境的成本足够低。最好使用现成的包,比如Brendan Gregg 发明的火焰图

关于火焰图的设计思路和详细使用方式,可以看他的论文:https://queue.acm.org/detail.cfm?id=2927301

FlameGraph

mysql

火焰图中最重要的信息,就是表示函数执行时间的 X 轴,以及表示函数调用栈的 Y 轴。函数方块的颜色是随机的,并没有特别的意义,只是为了在视觉上更容易区分开。

X 轴由多个方块组成,每个方块表示一个函数,其长度是定时采样得到的函数调用频率,因此可以简单粗暴地把它近似为执行时间。需要注意的是,如果函数 A 中调用了函数 B、C、D,监控采样时会形成 A->B、A->C、A->D 这 3 个函数调用栈,但火焰图会将 3 个调用栈中表示 A 函数的方块合并,并将 B、C、D 放在上一层中,并以字母表顺序排列它们。这样更有助于你找到耗时最长的函数。

Y 轴,它表示函数的调用栈。既可以看到内核 API 的函数调用栈,也可以看到用户态函数的调用栈

如何查看函数是否消耗过多CPU资源
  1. 首先,火焰图很容易从全局视角,通过寻找长方块,找到调用频率最高的几个函数。
  2. 函数方块长,有些是因为函数自身执行了很消耗 CPU 的代码,而有些则是调用的子函数耗时长造成的;如果函数方块的长度,远大于调用栈中子函数方块的长度之和,那么这个函数就执行了比较耗费 CPU 的计算。比如,下图中执行 TLS 握手的 ngx_ssl_handshake_handler 函数,自身并没有消耗 CPU 多少计算力。

    14c155f5ef577fa2aa6a127145b2acc2.jpg

    而更新 Nginx 时间的 ngx_time_update 函数就不同,它在做时间格式转换时消耗了许多 CPU,如下图所示:

    14c155f5ef577fa2aa6a127145b2acc2.jpg

使用perf-FlameGraph生成On CPU火焰图

该火焰图只能找到消耗 CPU 计算力最多的函数,因此它也叫做 On CPU 火焰图,由于 CPU 工作时会发热,所以色块都是暖色调。

# 安装
yum install perf
git clone --depth 1 https://github.com/brendangregg/FlameGraph.git

# 接着,针对运行中的进程 PID,使用 perf 采样函数的调用频率(对于 C/C++ 语言,为了能够显示完整的函数栈,你需要在编译时加入 -g 选项)
perf record -F 99 -p 进程PID -g --call-graph dwarf
或者全部进程
perf record -F 99 -a --call-graph dwarf
# 更多参数:https://www.brendangregg.com/perf.html

# 再将二进制信息转换为 ASCII 格式的文件,方便 FlameGraph 处理:
perf script > out.perf

# 再然后,需要汇聚函数调用栈,转化为 FlameGraph 生成火焰图的数据格式:
FlameGraph/stackcollapse-perf.pl out.perf > out.folded

# 最后一步,生成 SVG 格式的矢量图片:
FlameGraph/flamegraph.pl out.folded > out.svg



生成Off CPU 火焰图

有些使用了阻塞 API 的代码,则会导致进程休眠,On CPU 火焰图无法找到休眠时间最长的函数,此时可以使用 Off CPU 火焰图,它按照函数引发进程的休眠时间的长短,确定函数方块的长度。由于进程休眠时不使用 CPU,所以色块会使用冷色调。如下图所示:

详见:https://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html