Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8493
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2018-08-08 13:46
文章分类

全部博文(15)

文章存档

2018年(15)

我的朋友

分类: Java

2018-08-10 15:16:29

  自顶向下和自底向上是两种常用的性能分析方法。顾名思义,自顶向下着眼于软件栈顶层的应用,从上往下寻找优化机会和问题。相反,自底向上则从软件栈最底层的CPU统计数据(例如CPU高速缓存未命中率、CPU指令效率)开始,逐渐上升到应用自身的结构或应用常见的使用方式。应用开发人员常常使用自顶向下的方法,而性能问题专家则通常自底向上,用以辨别因不同硬件架构、操作系统或不同的Java虚拟机实现所导致的性能差异。如你所想,不同的方法可以用来查找不同类型的性能问题。

  后面两节将详细介绍这两种方法。

  1.2.1 自顶向下

  如前所述,自顶向下是最常用的性能调优方法。如果调优涉及软件栈顶层应用代码的更改,也常用这招。

  自顶向下时,你通常会从干系人发现性能问题的负载开始监控应用。应用的配置变化或日常负荷变化都可能导致性能降低,所以需要持续监控应用。此外,一旦应用的性能和扩展性需求发生变化,应用就可能无法满足新要求,所以也要监控应用程序的性能。

  不管何种原因引起的性能调优,自顶向下的第一步总是对运行在特定负载之下的应用进行监控。监控的范围包括操作系统、Java虚拟机、Java EE容器以及应用的性能测量统计指标。基于监控信息所给出的提示再开展下一步工作,例如JVM垃圾收集器调优、JVM命令行选项调优、操作系统调优,或者应用程序性能分析。性能分析可能导致应用程序的更改,或者发现第三方库或Java SE类库在实现上的不足。

  第2章和第4章可以帮助你了解自顶向下所需要监控的对象。这两章介绍了需要重点监控的统计数据,并且对统计值达到多少时需要进一步调查给出了建议。对于这些需要进一步调查的统计数据,你可以翻阅其他章节获得适当的行动建议。例如,操作系统监控数据显示系统CPU使用率高,你就可以分析应用程序的哪个方法耗费了最多的系统CPU周期。如何使用NetBeans Profiler和Oracle Solaris Studio Performance Analyzer(前身是Sun Studio Performance Analyzer),可以参见第5章和第6章。如果指示JVM垃圾收集器需要调优,你可以翻阅第7章。如果你想熟悉Java HotSpot VM垃圾收集器的基本运转机制,可以考虑在阅读JVM调优之前阅读第3章中的垃圾收集。如果你在监控应用的统计数据,例如Java EE容器所提供的统计数据,可以阅读Java EE性能调优的相关章节——第10章“Web应用的性能调优”、第11章“Web Service的性能”、第12章“Java持久化及Enterprise Java Bean的性能”,从中学习如何解决企业级应用的性能问题。

  1.2.2 自底向上

  在不同平台(指底层的CPU架构或CPU数量不同)上进行应用性能调优时,性能专家常使用自底向上的方法。将应用迁移到其他操作系统上时,也常用这种方法改善性能。在无法更改应用源代码,例如应用已经部署在生产环境中,或者系统供应商为了在竞争中占得先机而必须将性能发挥到极致时,也常常会使用这种方法。

  自底向上需要收集和监控最底层CPU的性能统计数据。监控的CPU统计数据包括执行特定任务所需要的CPU指令数(通常称为路径长度,Path Length),以及应用在一定负载下运行时的CPU高速缓存未命中率。虽然还有其他重要的CPU统计数据,但这两项是自底向上中最常用的。在一定负载下,应用执行和扩展所需的CPU指令越少,运行得就越快。降低CPU高速缓存未命中率也能改善应用的性能,因为CPU高速缓存未命中会导致CPU为了等待从内存获取数据而浪费若干个周期,而降低CPU高速缓存未命中率,意味着CPU可以减少等待内存数据的时间,应用也就能运行得更快。

  自底向上关注的通常是在不更改应用的前提下,改善CPU使用率。假如应用可以更改,自底向上也能为如何修改应用提供建议。这些更改包括应用源代码的变动,如将经常使用的数据移到一起,使得只要访问一条CPU高速缓存行(CPU Cache Line)就能获取所有这些数据,而不用从内存获取数据。这个改动可以降低CPU高速缓存未命中率,从而减少CPU等待内存数据的时间。

  现代Java虚拟机集成了成熟的JIT编译器,可以在Java应用的执行过程中进行优化,比如依据应用的内存访问模式或应用特定的代码路径,生成更有效的机器码。也可以调整操作系统的设置来改善性能,例如更改CPU调度算法,或者修改操作系统的等待时间(操作系统在将应用执行线程迁移到其他CPU硬件线程之前所花费的时间)。

  如果你觉得可以用自底向上的方法,那应该先从收集操作系统和JVM的统计数据开始。监控这些统计数据可以为下一步应该关注哪些重点提供线索。第2章、第4章介绍了重点需要监控的统计数据。依据这些数据,你再判断对应用和JVM进行性能分析是否有意义。应用和JVM的性能分析可以借助于工具。Oracle Solaris SPARC、Oracle Solaris x86/x64及Linux x86/x64上可以用Oracle Solaris Studio Performance Analyzer进行性能分析。其他流行的工具如Intel VTune或AMD的CodeAnalyst Performance Analyzer在Windows和Linux上也可以提供类似的信息。这3种工具都可以收集特定的CPU计数器信息,例如Java虚拟机执行特定Java方法或功能所用的CPU指令数和CPU高速缓存未命中率。如何在自底向上中使用这些性能分析工具非常重要。

阅读(272) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~