当前位置: 首页 > Linux

Linux性能分析工具与图解方法

时间:2023-04-06 20:29:12 Linux

欢迎来到腾讯云+社区获取更多腾讯海量技术实践的干货~。作者:赵坤|腾讯魔王工作室后台开发工程师在项目开发过程中,我们经常会遇到程序启动时间长、CPU占用率高等问题。这时候就需要借助性能分析工具来定位性能消耗点。本文介绍了三个常用工具的入门级使用和图解方法,供大家参考。本文介绍Perf、gprof、Valgrind这三个性能分析工具,以及分析结果图形化分析的方法,旨在让大家更快上手使用工具。限于篇幅,本文不会详细介绍各个工具的使用参数和结果分析,仅做入门级说明。更详细的说明请谷歌。每个工具的介绍都会分为三个部分:介绍、使用说明、图解方法。每个工具的结果将基于以下代码:#includeusingnamespacestd;#defineNUM500000voidinit(int*int_array){for(inti=0;iperf.unfold2,折叠perf.unfold中的符号:/data/stackcollapse-perf.plperf.unfold&>perf.folded3,最后生成svg图:/data/flamegraph.plperf.folded>perf.svg生成的火焰图如下:关于火焰图的含义和分析网上有很多文章,这里不再赘述。Gprof2.1简介Gprof用于监视执行时间和调用次数,用于找出程序中最耗时的函数。程序正常退出后,会生成一个gmon.out文件,解析这个文件可以生成可视化报告。2.2如何使用要使用gprof,需要在编译时加入-pg选项。另外,gmon只有在程序正常退出后才会产生。out,杀进程的方法无法生成gmon.out。对于那些线程会一直运行的服务,需要修改代码让程序在某个时间点停止。重新编译后,程序正常启动;然后程序运行后,会生成gmon.out文件。使用以下命令生成注册文件(其中run是二进制文件的名称):gprof-brungmon.out>>report。txtreport.txt打开如下图:2.3图解法gprof的结果文件需要使用gprof2dot.py和graphviz显示使用gprof2dot.py生成的dot文件pythongprof2dot.pyreport.txt>report.dot需要说明的是,这里要求服务器安装了python,并且要求gprof2dot.py与安装的python版本相匹配。两者是否匹配是运气问题,解决起来很无聊。我服务器上安装的python是2.6.6。第一次从网上下载的gprof2dot-2017.9.19与python版本不匹配。执行会出错。目前使用的版本兼容2.6.6,有需要的可以联系我。dot的打开需要使用graphviz工具。我在windows下安装了graphviz。这个工具的下载非常简单。下载后,使用gvedit.ext打开上一步生成的report.dot文件。这个图形有点可爱。这是因为我们的程序写起来比较简单。对于一般的业务,这个图形会比较复杂。.Valgrind3.1介绍Valgrind不是linux自带的工具,需要自己安装。Valgrind本身包含多个工具:Memcheck:用于内存泄漏检查Callgrind:用于性能分析,会收集程序运行时间和调用关系,还有Cachegrind、Helgrind等,这里主要使用Callgrind工具3.2如何使用首先需要安装valgrind:http://valgrind.org/downloads...解压安装包后依次执行:./configue,make,makeinstall。使用valgrind分析性能。必须使用valgrind来启动程序:valgrind--tool=callgrind--separate-threads=yes./run--separate-threads是指是否按线程单独统计。如果不添加,所有线程的结果将被打入一个文件;否则,结果将被线程内部打印到不同的文件中。程序执行后会生成一个类似:callgrind.out.4263-01的文件。直接分析这个文件比较困难,必须通过图形化的方式浏览。3.3图形化方法valgrind的图形化方法需要kcachegrind.exe的帮助。可以自己下载,下载后在windows上运行。这是打开callgrind.out.4263-01的结果:4工具对比对于我们的需求:定位执行时间最长和CPU占用最多的函数,三个工具都可以达到目的。但是三者还是有一定差距的:4.1启动方式Perf虽然可以挂载进程,但是需要root权限。正常权限下,Perf和Valgrind必须以前缀启动程序,这会在一定程度上影响程序的性能。在压力测试中,我们发现使用Valgrind启动时,可以支持的总在线人数比直接运行程序要少很多。4.2程序入侵Perf和Valgrind都不需要修改Makefile或程序,但是gprof需要重新编译文件,并且对于线程一直运行的服务,还需要修改代码让它自然退出,从而造成入侵某个程序中的程序。但是在对性能的影响上,gprof可以最大限度的保留原程序的性能。4.3结果表明gprof的结果是一棵倒置树,显示了所有节点从根到叶子的耗时;perf是一个金字塔,类似于gprof;valgrind的结果是单条路径,指出某条调用路径上的耗时,不是全局显示。4.4监控原理这是一个很专业的话题。目前对三者的监控原理还没有深入了解,这里暂时空着。如果你有兴趣,你可以先做研究。Q&Alinux实时调度算法?Linux中的多线程?相关阅读Linux常用性能工具介绍Linux常用调优命令及工具性能优化:Linux环境下合理配置大内存页[](https://link.juejin.im?target...本文已获得作者授权作者腾讯云+社区发布,转载请注明文章出处