Linux性能分析工具与图形化方法( 二 )


文章插图
 
这个图显的有些萌萌哒,这是因为我们的程序写的比较简单,对于一般的业务而言,这个图会比较复杂 。
三、Valgrind3.1 简介valgrind不是linux的原生工具,需要自行安装 。valgrind自身包含了多个工具:

  • Memcheck:用于内存泄漏检查
  • Callgrind:用于性能分析,会收集程序运行时间和调用关系
  • 以及Cachegrind、Helgrind等
这里我们主要使用的Callgrind工具
3.2 使用方法首先需要安装valgrind:http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2
解压安装包后,顺次执行:./configue 、make、make install 就可以了
使用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的结果:
Linux性能分析工具与图形化方法

文章插图
 
四、工具比较对于我们的需求:定位执行时间最长、占用CPU最多的函数 来说,这三个工具都可以达到目的 。但这三者之间还是有一定的差距:
4.1 启动方式perf虽然可以挂接进程但需要root权限 。在普通权限下,perf和valgrind必须使用前缀启动的方式来启动程序,这在某种程度上会影响到程序的性能 。我们在压测的过程中发现使用valgrind启动的时候,可以支持的在线总人数比直接运行程序要少很多 。
4.2 程序侵入perf和valgrind都不需要修改Makefile或者程序,但gprof需要重新编译文件,并且对于线程一直run的服务,还需要修改代码让其自然退出,这在一定程序上侵入了程序 。但从对性能影响上来看,gprof可以最大限制的保留原程序的性能
4.3 结果展示gprof的结果是一颗倒树,这颗树展示了从根到叶子的所有结点的时间消耗;perf的是一个金字塔,与gprof有异曲同工之妙;valgrind的结果是一条单路,指出的是某条调用路径上的时间消耗,并不是一个全局的展示 。
4.4 监控原理这是一个很专业的话题,目前对三者的监控原理还没有摸的太透,所以这里暂时空着 。大家有兴趣可以先行研究 。




推荐阅读