ApplicationPerformanceManagement(APM)是实时监控,实现应用性能管理和故障管理的系统化解决方案。目前主要是指对企业关键业务应用的监控和优化,最终达到提高企业应用的可靠性和质量,保证用户得到良好服务,降低IT成本的目的。虽然很多人都预言Java永远不会复苏,但不可否认的是,Java在很多重要的项目中仍然发挥着极其重要的作用,尤其是银行和政府的一些大型项目。陶炳哲,国内领先的APM公司OneAPM的Java工程师,多次参与银行、运营商等大型企业的性能优化。回收并应用布局。下面将一一讲解:1.商业交易商业交易是真实用户体验的直观反映:它们捕获用户在与应用程序交互时所体验到的实时性能数据。要衡量业务事务的性能,需要捕获业务事务的整体响应时间和每个组件的响应时间。然后将这些响应时间与满足业务需求的基准进行比较,以确定应用程序是否健康。如果您只打算衡量应用程序的一个方面,本文建议您衡量业务事务的性能。虽然容器指标可以帮助您决定何时调整集群大小,但业务事务决定了应用程序本身的性能。你不需要问应用服务器线程池(threadpool)的使用情况,而是用户能否快速完成业务交易,这些交易的性能是否正常。背景知识:业务事务由其入口点标识,入口点是用户与您的业务交互的入口点。此类交互包括:网页请求、Web服务调用或消息队列中的消息。当然,你也可以根据一个URL参数为同一个网页请求定义多个入口,或者根据一个服务调用的内容定义多个入口。关键是:商业交易必须与您的业务流程相关联。比如中国移动的航空话费支付业务,就对应了系统中的多个原子服务。我们应该把这些原子服务通过对应的关联聚合成一个空中服务。支付业务进行监控。一旦确定了业务事务,就会在整个应用程序生态系统中衡量其性能。将每个业务事务的性能与其基线进行比较,以确定它是否正常。例如,如果业务交易的响应时间大于您设置的阈值,我们将判断其行为不当。总而言之,业务交易最能体现用户体验,因此也是最重要的抓取维度。2.外部服务外部服务有多种形式:从属Web服务、遗留系统或数据库等。外部服务是与应用程序交互的系统。在外部服务系统中运行的代码通常是我们无法控制的,但我们可以控制这些系统的配置,因此了解它们是否正常工作以及何时出现故障也很重要。并且,我们必须能够区分问题是来自我们自己的应用程序还是来自这些外部服务系统。从业务交易的角度来看,我们可以在我们的应用程序中识别和衡量这些外部服务。有时,我们需要配置监控方法来识别包装外部服务调用的方法。但对于常见的协议,如HTTP、JDBC,可以自动检测外部服务。业务事务为您提供应用程序性能的全局视图,并帮助您对性能问题进行分类。但是外部服务会以意想不到的方式极大地影响应用程序的运行,因此您必须监视它们。3.垃圾回收从最早的Java版本发布开始,一直保留的核心特性就是垃圾回收,真是让人又爱又恨。垃圾收集消除了手动管理内存的需要:当我们使用完一个对象时,我们只需删除它的引用,垃圾收集就会自动释放它。如果您使用过需要手动内存管理的语言(例如C或C++),您将会很感激。垃圾收集减少了程序员分配和释放内存空间的繁琐步骤。此外,由于垃圾收集器会自动释放未引用的内存空间,因此减少了传统的内容泄漏情况,即分配内存并在释放内存之前删除对该内存的引用。听起来像灵丹妙药,不是吗?虽然垃圾回收实现了无需手动管理内存并防止传统内存泄漏的目标,但以这种代价为代价,垃圾回收过程有时会相当笨拙。根据不同的JVM,垃圾回收策略会有所不同。深入研究这些策略超出了本文的范围。但是,读者应该明白,了解垃圾收集周期如何工作以及最佳配置方案是至关重要的。垃圾回收最大的敌人就是传说中的major或者full垃圾回收。除了AzulJVM,所有JVM都有这个问题。总的来说,垃圾回收大致可以分为两类:二次垃圾回收发生的比较频繁,主要是为了释放生命周期短的对象。它们在运行时不会阻塞线程并且影响较小。然而,主要垃圾回收有时被称为“StopTheWorld(STW)”垃圾回收,因为它们会在运行时阻塞JVM中的所有线程。当垃圾收集运行时,它会运行可达性测试,如图4所示。它创建一组根对象,其中包含每个运行线程中直接可见的对象。然后它会探索根集合中的对象引用的其他对象,然后是这些对象引用的对象,直到所有对象都被引用。在这个过程中,它会记录(标记)当前活动对象的内存地址,然后清扫(sweep)所有没有被使用的地址。更准确地说,它释放所有未被根集合对象引用的内存。最终,它会压缩和组织此内存,以便可以分配新对象。根据JVM的不同,二级和一级回收方式会有所不同。图5和图6说明了辅助和主要集合如何在SunJVM中运行。在二级回收中,内存主要分配给Eden空间,直到被填满。接下来,复制收集器(copycollector)会将伊甸园中的活动对象复制到两个幸存者空间(survivorspaces,tospace和fromspace)。留在伊甸园的对象被移除。如果幸存者空间已满,但还有额外的活动对象,则这些对象将移动到永久空间。只有主要集合才能释放永久空间中的内存。最终,永久空间将被填满,并将进行一次大规模的收藏。它不会将活动对象复制到无法容纳在幸存者空间中的永久空间中。此时,JVM阻塞所有线程,运行可达性测试,清除年轻数据(Eden和两个幸存者空间),并压缩永久空间。我们称之为初级恢复。您可能认为堆越大,主要集合运行的频率就越低。但是在执行的时候,会比小堆耗时更长。因此,调整堆大小和垃圾收集策略对于应用程序性能也很重要。4.应用程序布局要讨论的最重要的性能指标是应用程序布局。因为云的出现,现在的应用变得更加灵活:应用环境的大小可以根据用户的需求进行调整。因此,检查应用程序的布局以确定实例数是否合适非常重要。如果您有太多实例,您的云托管成本将会增加。但是,如果您没有足够的实例,业务交易就会受到影响。在评估过程中,以下两个指标尤为重要:业务交易的吞吐量容器性能业务交易应该进行基准测试,您应该知道在给定时间满足基准测试所需的实例数。如果您的业务交易吞吐量突然增加,您需要增加实例数来满足用户。另一件要监控的事情是容器性能。具体来说,您想要确定您的应用程序中是否有任何实例过载,如果是,您可能想要向该应用程序添加实例。从应用的角度看实例状态很重要,因为垃圾回收等因素可能导致单个实例过载,但如果一个应用中的大部分实例都过载,应用可能已经无法支撑流量它正在接收。由于应用程序中的实例可以单独扩展,因此分析各个实例的性能以调整应用程序布局至关重要。
