热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自动执行Java性能优化

http://www.oracle.com/technology/global/cn/pub/articles/brahms-tuning.html?_template=/ocom/pr

http://www.oracle.com/technology/global/cn/pub/articles/brahms-tuning.html?_template=/ocom/print


作者:Carl Brahms

自动执行负载生成和性能优化过程为什么可以节省大量的时间和精力。

2008 年 9 月发布

优化可能是一项非常艰巨而费时的工作,尤其对于需要最佳性能的环境来说更是如此。优化所带来的好处是使环境更稳定、故障更少、总体性能更佳。也许您 幸运地拥有内部性能优化人员和专门的性能优化环境,如此优越的条件是非常罕见的。如果您像其他人一样,需要在有限的时间内完成性能优化,本文将为您讲述自 动执行调优过程如何比手动调优更轻松、更快捷、更全面。


性能优化的基本原则

Java 性能优化是一个持续不断的、通常历时很长且令人沮丧的过程。调优很少会一次性解决性能问题。有时,不管您添加了多少硬件,或者花了多长时间试图调整晦涩难 懂的内存参数,可能都难以达到理想性能。要获得最佳性能,需要明确的性能目标、深思熟虑的设计、坚实的执行情况,并且最终要执行彻底的性能优化。


首先要制定明确的性能目标

在采取任何步骤优化性能之前,首先要确定性能目标。这是因为预期的行为和用户数、数据量以及请求大小在很大程度上决定着您将作出什么类型的优化决策。每个环境都是唯一的,清楚地了解应用程序和环境的限制以及您希望达到的性能和负载水平,对于您日后深入过程将有所帮助。


优化 WebLogic Server 设置

可以调整的 WebLogic 设置差不多有几百个:池大小、调整连接积压缓冲、缓存、JDBC 和 JMS 设置、使用工作管理器设置优先级、集群等。您可以先从查看 WebLogic Server 的几大优化建议 开始。


查找瓶颈

问题并不总是与 JVM 或 WebLogic 设置有关。请确保正确调整操作系统和网络设置以满足应用程序要求,尤其在使用 UNIX 或 Linux 时。在负载状态下监视服务器的磁盘和网络 I/O 以及 CPU 利用情况。如果数据库性能不佳,还应检查您的数据库块大小、池大小和其他特定于供应商的性能优化设置。任何基础资源限制都可能导致显著的性能下降。

请记住,最终目的只是达到您的性能目标,而不是清除每一个瓶颈。系统中将始终存在一个瓶颈或最慢部分,但最要紧的是达到您的性能目标并使客户满意。


优化应用程序代码

设计应用程序时需要考虑性能因素,这一点是显而易见的。在当前的 SOA 环境中,应用程序很容易变得过于复杂,并存在很多影响性能的问题。设计不良的应用程序可能会引发系统资源、网络或数据库瓶颈。请使用经过验证的性能模式来设计应用程序,并使应用程序尽量简单。


优化堆

无论使用什么应用程序,如果堆不足或花费大量时间进行垃圾收集,您都应该尝试调整整个堆及其新生代的大小。可用堆的大小通常会显著提高或降低应用程序的性能。

为 WebLogic 服务器确定合适的堆大小对于提高性能非常重要。作为确定大小的一般规则,您希望在每次垃圾收集结束时释放大约一半的堆空间。换言之,即堆的大小应至少是其活动对象的两倍。

也许最基本的堆性能优化步骤是将最小堆大小设置成与最大堆大小相同。此建议同样适用于新生代(在 Sun HotSpot 中为 New generation,在 Oracle JRockit 中为 Nursery)大小的设置。默认情况下,经常出现堆扩展和堆收缩时 JVM 会浪费资源。

您尽可以将堆大小设置为系统可以处理的最大值(除去操作系统和其他应用程序所需的内存)。较大的堆会降低垃圾收集的频率,但可能需要花费较长时间来执行较大的垃圾收集。

VM 用于处理本地库和 permGen(如果使用 Sun HotSpot)的内存始终大于堆大小,因此请注意,不要超出物理 RAM 的总大小。操作系统将内存分页到磁盘时将显著降低性能。


试用垃圾收集器

垃圾收集是用于从不再使用的对象中回收堆空间的一种机制。有多种垃圾收集模式(从 JVM 到 JVM),这些模式都以不同方式使用系统资源。您在优化过程中的工作是确定什么类型的垃圾收集模式最适用于您的特定应用程序和性能目标。选择收集器时的目 标就是使垃圾收集暂停时间尽量缩短,从而提高垃圾收集吞吐量。

有关如何使用 JRockit 垃圾收集模式的信息,请参见“选择和优化垃圾收集器”部分。有关 Sun HotSpot VM 可用的垃圾收集模式的详细概述,请参见 Sun 的 Tuning Garbage Collection with the 5.0 Java Virtual Machine (使用 5.0 Java 虚拟机优化垃圾收集)。


其他注意事项

JRockit 和 Hotspot JVM 提供了许多特定的 JVM 性能选项。影响性能的 WebLogic 设置非常多。要进行有效优化,最重要的是使开发人员、架构师、系统工程师、QA 测试网络工程师和 DBA 作为一个团队进行协作。在优化过程中实现跨学科参与可以精简工作,获得更佳结果,从而最终降低优化所需的成本和时间。


自动化的优点

我们已经了解了 WebLogic 性能优化的几个基本原则,现在来看一下自动执行这些任务如何真正使性能优化更容易、更省时、更有效。


快速更改,频繁优化

我曾多次看到,自动执行性能优化过程所产生的结果比专家独自执行优化所产生的结果更好。这主要是因为,自动过程可以快速执行更改并确定和衡量更改对 性能的影响,比神经最兴奋的人还要快,还要周到。另外,由于调优变成一个省力的过程,您还可以针对每次代码发布进行优化,从而与应用程序更改取得同步。对 应用程序功能的细微更改都会导致很多预料不到的性能问题。

另外,很多人错误地认为调优是可做可不做的事情,因为他们当前的响应时间很充裕。人们很容易忽略这样一个事实,即正确的调整可以提高服务器的稳定性和持久性。不调整或错误调整可能会导致故障,而经过正确调整的环境运行起来更具可预测性且更稳定。


节省时间,挖掘性能潜力

我们在优化服务器上通常做得不够频繁或不够彻底,仅仅因为这一过程非常费时。当您自动执行此过程时,手动执行需要几天时间的工作现在在无人干预的情况下一晚上即可完成。以前花无数个小时进行调优的人员现在可以节省这些时间做更有意义的事情。

随着故障减少、性能提高、正确利用硬件、“繁重工作”减少以及可以利用节省的时间做更多工作,自动执行 Java 优化所带来的财务结余将会快速增长。在当今苛刻的环境中,性能上的细小收益通常都会带来显著的资源节省。


边看边学

了解代码更改和不同调优变量如何影响性能非常具有启发作用。自动执行优化和分析允许您尝试更多不同的设置组合,并且通过适当的监视,您可以同时看到结果。这就像站在性能专家团队的肩膀上;您开始了解为何作出某些优化决策,在这个过程中您能够学到很多知识。

您还能够针对每次代码发布轻松地优化服务器,这也算是一个很不错的意外收获吧。由于知道将不会有惊喜,因此在部署生产时,您会拥有一个比较平和的心态。


逐步执行自动优化

在本部分中,您将了解使用 Arcturus Applicare 优化向导查找最佳 JVM 设置的过程。为了节省时间,我将演示测试各种垃圾收集设置的过程。

简单来讲,优化向导将启动负载测试、监视服务器、分析行为、基于嵌入式智能作出决策、优化配置并回弹服务器。此过程将重复执行,自动优化各种 JVM、操作系统和 WebLogic 设置,直至找到最佳组合。以下是每个步骤的分解内容。





图 1. JVM 自动优化过程

由于自动执行时优化变得非常容易,因此您可能很快就希望进行微调和试验。在优化向导中,有很多可用于控制资源利用的高级选项,我将在后面进行详细介绍。与 在任何性能优化过程中一样,您需要对应用程序行为有所了解。如果应用程序有预热时间或初始缓存时间段,必须确保运行足够时间的负载才能获取精确结果。


选择负载测试设置

优化向导与 Apache JMeter、HP Load Runner 和 The Grinder 负载生成工具进行了集成,它还能够触发您自己的自定义 Java 应用程序和 shell 脚本所生成的负载。我还没有生成负载工具设置或任何负载脚本,因此我使用 JMeter(系统自带)并遵循以下指令来记录测试脚本。

启动优化向导时,我指定了负载脚本,它允许自定义要模拟的用户数。在本次测试中我选择了 70 个用户,因为根据以前的测试我知道,当用户数达到此数值时我的应用程序性能开始下降。

第一次优化服务器时,您可能不了解您的应用程序处理多少用户才会导致性能下降。如果我不清楚我的环境可以处理多少用户,我可能会使用一个称为“容量 确定”的简洁功能(图 2),而不必进行猜测和购买更多服务器。容量确定的目的是找到良好吞吐量的最佳平衡,而不超出您的资源利用限制。容量确定允许您设置初始用户数和将要尝试 的最大用户数,在优化时它将增加负载,直至在吞吐量和资源利用之间找到平衡点。





图 2. 自动执行容量确定功能



选择测试条件

接下来,您需要选择每个优化会话要采用的监视样例数,以及这些会话之间的时间间隔。正如我在前面提到的,如果您的应用程序有预热时间或初始缓存时间 段,则此时您可以通过优化设置来确保测试时间足够长,以便得到精确的基准值。我选择每个会话采用 20 个样例,时间间隔为 60 秒。





图 3. 由于应用程序各不相同,您可以根据需要调整样例数及样例时间间隔,以获得精确的基准值。



开始“执行”

现在您可以坐下来放松一下。您还可以安排在任意时间开始优化,这样,如果您要在以后的非高峰时间进行优化,则不必亲临现场。优化向导将尝试其中每个设置,当优化结束后,优化向导会生成报表,给出有关哪些设置提供最佳性能的建议。

当服务器处于负载状态下时,优化向导将监视服务器的性能和运行情况。向导通过查看吞吐量、堆信息、CPU 利用情况、线程、等待者、队列(基本上包括了您所观察的全部内容 — 如果您亲自运行负载测试的话)完成此任务。在启动优化会话时可以设置和自定义样例之间的频率和时间间隔。

这是优化向导和 Applicare 其他功能最具吸引力、最有价值的一个方面。它随制定智能化性能优化决策的人工智能引擎一起提供。根据性能优化顾问的综合经验、经过验证的优化方法和最佳实 践构建了知识库。可以查看负载测试过程中生成的数据,并对下一步将要优化的内容作出明智的决策。优化向导在达到最佳可能组合后,将结束优化过程。

我可以在 Applicare 控制台中实时查看进度表,也可以等到测试结束后查看报表。如果您要查看数据以便得出自己的结论,可以参考大量的报表和图表,它们针对每个优化设置的行为提供了完整的详细信息。


结果

在这里,我简要讨论优化结果,显示 Applicare 创建的一些有关优化会话的图表,并讨论 Applicare 给出的一些其他建议。这不是详尽的优化练习,但它显示了优化向导在少量负载状态下可以在短时间内完成的任务。优化过程历时 4 小时完成,它尝试了 9 个不同的设置组合,并优化了 JVM 设置和其他设置,包括线程、JDBC 设置等。优化向导查找过小或过大的配置区域并进行适当设置。根据我为优化向导提供尝试的参数,最佳设置如下:

-Xms512m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=48m
-XX:MaxPermSize=128m -Xverify:none -XX:NewRatio=3
-XX:SurvivorRatio=6 -XX:+UseParallelGC

Applicare 提供一组显示优化结果的图表,为了节省空间,我给出了显示优化前后变化的吞吐量和堆图表。您可以看到堆的利用率较低,并且主要垃圾收集的暂停时间较短。您 还可以看到,在主要垃圾收集发生时吞吐量下降,这表明优化前的初始设置在主要垃圾收集期间会导致很长的暂停时间。





图 4. 此图表显示优化后的吞吐量(蓝色)好于优化前的吞吐量(绿色)。






图 5. 会话之间的堆利用情况对比。优化后的最终结果是内存使用率较低。



其他建议

Applicare 还检测到应用程序运行时行为和服务器配置方面的问题。它检测出 EJB 缓存配置不当,并建议增加缓存大小。

另外,Applicare 的诊断结果还指出,在优化过程中打开的会话数太多以致于影响了性能(有时超出 17,000 个会话)。它指出了一些实例,在这些实例中对我的应用程序的某些 Web 应用程序的会话失效间隔秒数设置过高,并建议进行重新评估,以免非活动会话打开时间过长。

幸运的是,我不必猜测或查找这些瓶颈,因为工具已将这些瓶颈清晰地显示出来。


高级选项

优化向导提供了一些预定义的选项,供每个 WebLogic 支持的 JVM 试用,以便找到适用于您的环境的最佳垃圾收集器,但它也为高级用户提供了尝试任意所需选项的灵活性。在此次测试中,我尝试了一些我自己的设置,向导仅用几 个小时就找到了最佳设置,为我节省了很多精力。

applicare.jvmparams.param6= -Xmn256m -Xss128k -XX\:+UseConcMarkSweepGC
-XX\:+UseParNewGC -XX\:SurvivorRatio\=8 -XX\:TargetSurvivorRatio\=90
-XX\:MaxTenuringThreshold\=3 -Xms512m -Xmx512m -XX:CompileThreshold=8000
-XX:PermSize=48m -XX:MaxPermSize=128m -Xverify:none
applicare.jvmparams.param5= -Xmn256m -Xss128k -XX\:+UseParallelGC
-XX\:+UseParallelOldGC -XX\:+UseBiasedLocking -Xms512m -Xmx512m
-XX:CompileThreshold=8000 -XX:PermSize=48m -XX:MaxPermSize=128m
-Xverify:none applicare.jvmparams.param4= -Xmn256m -Xss128k
-XX\:+UseParallelGC -XX\:+UseParallelOldGC -Xms512m -Xmx512m
-XX:CompileThreshold=8000 -XX:PermSize=48m -XX:MaxPermSize=128m
-Xverify:none applicare.jvmparams.param3= -XX\:NewRatio\=3
-XX\:SurvivorRatio\=6 -XX\:+UseConcMarkSweepGC -Xms512m -Xmx512m
-XX:CompileThreshold=8000 -XX:PermSize=48m -XX:MaxPermSize=128m
-Xverify:none applicare.jvmparams.param2=-XX\:NewRatio\=3
-XX\:SurvivorRatio\=6 -XX\:+UseParallelGC -Xms512m -Xmx512m
-XX:CompileThreshold=8000 -XX:PermSize=48m -XX:MaxPermSize=128m
-Xverify:none applicare.jvmparams.param1=-XX\:+UseParallelGC
-XX\:MaxGCPauseMillis\=3 -Xms512m -Xmx512m -XX:CompileThreshold=8000
-XX:PermSize=48m -XX:MaxPermSize=128m -Xverify:none

您还可以配置在容量确定优化运行期间要利用的 CPU 数量。通常情况下,多个受管理服务器共处同一环境中,因此您自然希望限制负载状态下每个过程所占用的硬件空间。通过对可接受的队列长度、等待者数量和其他可配置选项进行限制,可以使工具满足您环境的独特优化需求。


结论

优化 WebLogic 的过程保持不变,只是运行负载、分析性能、适当更改和重新启动 WebLogic Server 这些繁琐的工作全部无缝地自动完成。优化向导是一个自动执行负载生成和性能优化的省时工具。

我已经在本文中介绍了 JVM 自动优化功能,但 Applicare 还会自动进行配置分析、问题检测、根本原因检测,并提供一系列旨在提高性能和可用性的其他功能。


参考资料




  • BEA 的 JVM 优化指南
    — 介绍 JRockit 和 HotSpot 优化注意事项


  • EJB 优化
    — WebLogic Server EJB 优化指南


  • 优化向导
    — 有关 Arcturus 优化向导的更多信息


  • 请求演示
    — 您可以请求 Applicare 演示并试用它


自动执行 Java 性能优化




推荐阅读
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • HTTP请求与响应机制:基础概览
    在Web浏览过程中,HTTP协议通过请求和响应报文实现客户端与服务器之间的通信。当用户访问一个网页时,浏览器会发送一个HTTP请求报文至服务器,服务器接收到请求后,会生成并返回一个HTTP响应报文。这两种报文均包含三个主要部分:起始行、头部字段和消息体,确保了数据的有效传输和解析。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 在处理分享功能时,以往通常会首先考虑使用第三方SDK,如友盟等。然而,通过实际项目经验发现,利用iOS原生的UIActivityViewController不仅可以实现高效、稳定的分享功能,还能更好地控制用户体验。本文将详细介绍如何利用iOS原生技术缓存HTML内容,并结合URL分享的最佳实践,帮助开发者在实际开发中提升应用性能和用户满意度。 ... [详细]
  • Go语言中Goroutine与通道机制及其异常处理深入解析
    在Go语言中,Goroutine可视为一种轻量级的并发执行单元,其资源消耗远低于传统线程,初始栈大小仅为2KB,而普通线程则通常需要几MB。此外,Goroutine的调度由Go运行时自动管理,能够高效地支持成千上万个并发任务。本文深入探讨了Goroutine的工作原理及其与通道(channel)的配合使用,特别是在异常处理方面的最佳实践,为开发者提供了一套完整的解决方案,以确保程序的稳定性和可靠性。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
author-avatar
求学lx
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有