如何用火焰图分析程序性能瓶颈

一个经验非常丰富的程序员可能可以静态分析程序的性能瓶颈,但大多数人做不到这些。这个时候我们往往需要借助一些辅助工具来分析程序的性能瓶颈,火焰图就是其中之一。

一张典型的火焰图长这样

本文主要介绍如何生成和分析火焰图。

如何生成火焰图

第一步:使用perf生成采样日志

火焰图是根据perf命令生成的日志文件来生成的,所以首先需要使用perf命令对所需要分析的进程进行采样。

perf record -F 99 -p 1234 -g -- sleep 30
perf script > out.perf

命令解释:

-F 99 表示每秒采样99次
-p 1234 表示采样的进程id是1234
-g表示记录调用栈
--sleep 30 表示采样时长为30s

运行上面两个命令之后,会生成一个out.perf文件

第二步:下载FlameGraph

FlameGraph用于将采样日志转换成svg图片,这个图片就是我们见到的火焰图。

FlameGraph地址:https://github.com/brendangregg/FlameGraph

第三步:生成火焰图

上面我们得到了out.perf文件,下载了FlameGraph之后,解压,里面有一些脚本,我们要用下面的脚本生成out.folded文件

./stackcollapse-perf.pl out.perf > out.folded

然后用out.folded文件生成svg

./flamegraph.pl out.folded > perf.svg

如何分析火焰图

未完待续

参考资料:

https://queue.acm.org/detail.cfm?id=2927301

http://www.brendangregg.com/flamegraphs.html

你可能还喜欢下面这些文章

openssl生成rsa公钥私钥

输入opensslj你如openssl交互界面OpenSSL>生成rsa私钥OpenSSL> genrsa -out private_key 1024Generating RSA private key, 1024 bit long modulus………………….++++++…………++++++e is 65537 (0x10001)生成公钥OpenSSL> rsa -in private_key -pubout -out public_keywriting RSA key

mac下git配置beyondcompare作为合并冲突工具

首先安装beyond compare,下载地址: http://www.scootersoftware.com/download.php设置为默认的merge工具git config --global merge.tool bc设置为默认的diff工具git config --global diff.tool bc在使用 来解决冲突后,会生成 备份文件 (*.orig),大多数情况下不是我们想要的,在终端中配置:git config --global mergetool.keepBackup false这样就不会每次在解决冲突后生成对应的 .orig文件了. 

使用apidoc为你的项目编写api文档

在使用apidoc之前,我一直使用wiki来写文档,后来发现这种方式更新起来比较痛苦,时间一长甚至就忘记了更新了。一直在寻找能够使用注释直接生成文档的程序。某一天同事推荐了apidoc,发现这正是我想要的工具。apidoc原理apidoc的原理是扫描你的代码文件,提取出注释部分,根据一些规则生成相应的文档。默认的模板久很美观,十分适合作为api文档的生成器。目前apidoc支持的注释基本涵盖了大部分语言的风格了,c,java,php,js,python,perl,lua, Erlang...安装需要使用npm安装,如果没有安装npm,请先去https://www.npmjs.com/下载npm

mac下面查看端口占用进程情况

在linux下面有netstat可以查看指定端口被哪些进程占用,但是mac下面就不好用了,看不到进程号。mac下面可以使用lsof来查看端口被哪个进程占用,比如查看80端口被占用情况:lsof -i tcp:80lsof是列出打开的文件命令,更多的用法可以参考: https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/lsof.html原文如下:lsof(list open files)是一个查看当前系统文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (

Redis持久化

在一个高并发,但是数据量不大的系统中,使用Redis做数据库再好不过,结合Swoole,只需要很少的机器就能抗住很大的量。Redis大多数的应用可能都是当做缓存,当作为一个数据库用的时候,就必须要考虑持久化的问题了。持久化的意思就是将内存中的数据写到磁盘中,当再次重启之后,数据可以从磁盘中进行恢复,不会丢失。Redis持久化有两个策略,一个是RDB快照,一个AOF日志,不管是什么策略,最终的目的都是将数据保存在磁盘上,并不高深。只需要耐心的看看这两种策略,就能明白了。RDB快照从名字上我们就能知道这是RedisDB的缩写了,Redis快照是这样生成的,到了需要生成快照的时候,通过fork当前进

linux命令:ls用法,列出文件及目录

原标题:每天一个linux命令(1):ls命令ls 命令是linux下最常用的命令。ls命令就是list的缩写缺省下ls用来打印出当前目录的清单,如果ls指定其他目录那么就会显示指定目录里的文 件及文件夹清单。 通过ls 命令不仅可以查看linux文件夹包含的文件而且可以查看文件权限(包括目录、文件夹、文件权限),查看目录信息等等。ls 命令在日常的linux操作中用的很多!ls命令格式ls  命令功能列出目标目录中所有的子目录和文件。常用参数-a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件-A 同-a,但不列出“.”(表示当前目录)和“..”(表示当前目录的父目录)。

gcc/g++编译参数详解

编译步骤gcc 与 g++ 分别是 gnu 的 c & c++ 编译器。gcc/g++ 在执行编译工作的时候,总共需要4步:预处理,生成 .i 的文件将预处理后的文件转换成汇编语言, 生成文件 .s 有汇编变为目标代码(机器代码)生成 .o 的文件连接目标代码, 生成可执行程序 参数详解-x language filename参数含义为指定文件所使用的语言。根据约定,C语言的后缀名称为".c",而 C++ 的后缀名为".cpp"或".cc",但如果你的源代码后缀不约定的那几种,那么需要使用-x参数来指定文件所使用的语言。这个参数对他后面的文件名都起作用。 可以使用的参数吗有下面的这些:

linux文件描述符介绍

文件描述符是什么文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。尽管这种习惯并非Unix内核的特性,但是因为一些 shell 和很多应用程序都使用这种习惯,因此,如

MySQL开启慢查询日志以及慢查询日志分析

mysql满查询有助于让我们发现系统中瓶颈所在。开启方法默认情况满查询应该关闭,如果需要分析则需要手动开启。mysql> show variables like '%slow_query_log%'; +---------------------+--------------------------------------+ | Variable_name | Value | +---------------------+--------------------------------------+ | slow_

GDB入门:使用bt查看程序出core的调用栈

当程序崩溃的时候,会产生一个core文件。我们可以称它为进程死亡现场。排查进程死亡就和破案一样,找到案发现场,仔细排查每个细节,抽丝剥茧,最终定位原因。很幸运我们有一个强大的工具调查现场信息。这个工具就是GDB。下面我们就来看看如何用GDB排查问题。首先以一个越界访问数组的程序为例,如下:#include #include void core() { std::vector<int> a; std::cout << a;}int main() { core(); return 0;}执行上面的代码将会产生一个core文件。假设我们的core文件为

赞赏

微信赞赏支付宝赞赏

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注