Skip to content

Latest commit

 

History

History
88 lines (44 loc) · 8.36 KB

performance-arsenal.md

File metadata and controls

88 lines (44 loc) · 8.36 KB

性能分析的军火库

你好,我是陈沁悦。

小时候,我喜欢看各种警匪片,枪战片,动作片和谍战片。施瓦辛格,汤姆·克鲁斯,007和成龙在枪炮声中伴我度过了愉快的童年。

这些动作片中经常有这样一个场景,行动之前,主角会被带到一个隐蔽的军火库,墙上或者车里挂满了各种武器,手枪、步枪、手榴弹,火箭筒应有尽有。

007还会拿到一些特殊的高科技武器,而黑衣人则会有对付外星人的特殊装备。这个场景非常有代入感,小时候的我看到这个场景总是不免对着屏幕流口水,是选那把有六个炮筒的加特林还是异常威武的火箭筒呢?(你如果感兴趣,可以去B站,看看这些让人激动的片段。(https://www.bilibili.com/video/av49613050/

每个职业都有自己的军火库。性能分析师不例外,我想,作为开发者的你可能会好奇,我不是性能分析师,需要这样的军火库吗?

我曾经给服务团队的同事介绍过我们开发的性能分析工具。介绍完后,我问服务团队的同事:这些能帮你解决客户那边的问题吗?

服务团队的同事告诉我,大家都非常乐意储备这样的工具知识。因为一旦当你遇到合适的问题时,你就不再是赤手空拳,而是手上握着重机枪,所向披靡。

我们这一篇将讲一讲性能分析师的军火库。作为应用开发者,我们只需要熟练掌握其中的两三种常用的工具。对于其余的,我们需要知道它们能分析什么样的性能问题。这样我们就能在遇到性能问题时迅速找到趁手的武器,而不是赤手空拳去现场插桩写计数器了。

性能分析工具有哪些?

我们来看下面这张思维导图,这张图上满满的工具就是性能分析师在Linux平台上的军火库了。我按照性能分析的对象和分析手段不同,对这些武器做了分类。这样,你在遇到性能问题的时侯,通过这张图,按图索骥就能找到自己能用的工具,然后看工具的文档现学现卖,也能慢慢找到应用中性能问题。

图片

下面,我来讲一讲,我们拿到这张图,应该怎么用?

这张图的左侧**,我****把工具按照性能分析的对象进行分类的,包括了处理器,内存,网络,I/O,图形处理器,编程语言和中间件几大块。**

**图的右侧是把工具按照分析手段不同进行分类,分****为概要分析工具(overview tool),采样工具(sampling),追踪工具(trace)和可视化集成环境几部分。**

每一类中的工具相互都有功能重叠,甚至是可以互相取代,比如sar,nmon和top,再比如perf和OProfile。

这是因为我们要去做性能分析的平台,很有可能并不是我们的开发环境,有可能是测试环境,有可能是客户的生产环境。我们并不一定能安装自己熟悉的工具,而只能有什么用什么。

如何利用你的性能分析军火库

在遇到性能问题时,我们应该先通过概要分析工具采集信息。 通过概要分析,我们可以判断存不存在一些明显的问题根源(比如内存/磁盘耗尽),并且定位出问题属于哪个领域,这是一个处理器问题呢,还是I/O问题?

如果你是运维,那么你很有可能根据问题所属的领域,在图的左侧寻找相应领域的性能分析工具。处理器不够加处理器,paging太多买内存。

但是,如果你是应用开发者,你有机会去调优应用代码,对吧?那么我们的思路就会和运维有所区别。我建议你从采样工具和映描工具开始。我们在这里要先做一个判断。这是一个处理器利用率有关的问题吗?

“处理器利用率低”相关问题

如果这是一个和处理器利用率有关的问题(处理器利用率高),并且很有可能和我们的应用有关(比如我们应用的进程CPU占用率特别高),我们应该优先考虑使用采样工具(oprofile/perf)寻找出有问题的模块,函数和代码。

因为这是效率高而且额外负载比较小的手段。当我们找到有问题的模块,函数和代码后,我们可以通过性能调优来解决这个问题。

但是,有的时候,我们会遇到另外一个问题,处理器占用率最高的函数本来就是计算密集型的,比如矩阵乘法函数,调得多了自然就消耗处理器资源。这时,我们就需要通过采样工具的调用图,或者通过映描工具(trace)比如gprof从trace中找到是谁调用了它,看看有没有优化空间。

“应用慢”相关问题

**如果这并不是一个处理器利用率有关的问题,而仅仅是应用慢的问题。**我们就需要通过映描工具比如iTrace、strace、Gprof根据调用关系去一层层的从顶向下寻找到底哪一部分模块,哪一部分函数是慢的根源。

要注意的是,细粒度的映描工具比如Gprof可能带来比较大的额外开销,而让应用的行为发生比较大的变化,比如某些频繁调用的函数会消耗更多的时间,这会给我们的分析带来困难。

另外,通过映描工具做分析往往需要更多时间和对工具更多的了解。当我们找到是哪一段代码慢时,我们可以尽可能地去调优它。左侧的工具这时也能帮助我们从另一个维度理解这段代码慢的根源。

编程语言和中间件相关问题

当性能问题可能和具体的编程语言环境有关时,比如我们的应用是Java,Python,JavaScript这样的解释执行语言编写的,**这些语言环境和二进制码应用并不一样,我们就要考虑使用这些语言环境相关的性能分析工具。****比如**

而当性能问题被定位到我们依赖的软件和中间件时,比如MySQL数据库时,我们需要使用和这些中间件相关的性能分析工具。中间件相关的性能分析工具实在太多了,我在这里就不一一赘述了。

可视化集成开发环境

如果你可以在自己的开发环境中重现这个性能问题,我强烈建议你使用可视化集成开发环境。

通过可视化集成开发环境,你可以快速完成采样到分析的每一个步骤,可以通过可视化界面从不同的视图分析性能问题。

针对不同的目标平台,有不同的集成开发环境。如果是x86平台,可以选择Intel VTune客户端或者集成到Visual Studio中的Intel Vtune,如果是IBM系的Power,Z,i平台,可以选择Rational Developer。如果是GPU,还可以试试AMD的Code XL。

如果你追求武器库般的视觉冲击力,我自己非常喜欢链接中Brendan D. Gregg画的这张图,推荐Linux平台上的应用开发者收藏。(http://www.brendangregg.com/Perf/linux_perf_tools_full.svg)在他的图中,工具和Linux的不同模块绑在一起,看起来更像装满了各种枪炮的武器架。

下面这张图是我画的性能分析师军火库的全平台版本。作为开发者,我们在工作生涯中会为不同的平台编写应用。

图片

它可以是历史悠久的主机上运行的银行核心业务,也可以是在Windows和安卓平台上运行的社交软件。但是没有关系,我们只要掌握了某个平台上的一种工具,根据它的名称和用途,我们就能在其他平台上找到替代品。

对于Unix平台来说,大部分的工具和Linux平台上名称都是一致的,或者稍微改改名字,比如Linux上的top和AIX上的topas。 微软的Windows平台和IBM的主机zOS系统会有点特殊。这两个操作系统都是单一供应商,Windows平台上很多性能分析功能都可以在WPR和WPA中找到,而zOS平台上很多性能分析数据都可以在RMF和SMF中获得。

在手机平台上,安卓因为是从Linux派生而来,很多Linux上的性能分析工具比如oprofile也能在安卓上使用,谷歌也为安卓系统提供了一些专有的性能分析工具。

总结

最后,我好像遗忘了某个用户数特别巨大的平台,在这个平台上如果要采集采样和trace,应该用哪个工具呢?