Java/J2EE应用Profiler整合问题及解决方案

日期: 2011-11-27 作者:Madhu Tanikella翻译:刘志超 来源:TechTarget中国 英文

在《Java/J2EE应用Profiler整合:调试类型和调试流程》和《Java/J2EE应用Profiler整合&治理实践挑战》中,列出了在整合调试工具和Java/J2EE应用程序(独立的或者是基于应用服务器的)中一些最常见的实践挑战,在应用程序性能管理流程中探讨调试集成活动,工作区可以明显地帮助减少运转时间需求。下面将提出具体建议和方法。   不可协调的应用程序   问题   在某些情况下,应用程序不是性能的调整或者业务场景具有很高的响应时间,应用程序(应用服务器)和profiler会引起超时,应用服务器有时甚至会不能启动。这是用于调试工具创建字节码编译器的额外开销,方法执行时间的……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

《Java/J2EE应用Profiler整合:调试类型和调试流程》《Java/J2EE应用Profiler整合&治理实践挑战》中,列出了在整合调试工具和Java/J2EE应用程序(独立的或者是基于应用服务器的)中一些最常见的实践挑战,在应用程序性能管理流程中探讨调试集成活动,工作区可以明显地帮助减少运转时间需求。下面将提出具体建议和方法。

  不可协调的应用程序

  问题

  在某些情况下,应用程序不是性能的调整或者业务场景具有很高的响应时间,应用程序(应用服务器)和profiler会引起超时,应用服务器有时甚至会不能启动。这是用于调试工具创建字节码编译器的额外开销,方法执行时间的线性增加的开销,并造成业务场景执行时间的增加,导致超时。

  推荐的解决方案

  推荐的建议是,确定高延迟的代码组件,“通过引入应用程序中的Java代码,捕获在关键方法中的时间开销。”然而,这种方法有弊端,选择关键的/决定性的类和方法,引用一个业务交易和工具,并记录代码修改和部署的状态。

  以下的代码片段说明了这一点。

以下是引用片段:
Class A {
                private long startTime, endTime;
                public Obj obj1;
                public Obj obj2;
                void public method1(){
                                startTime = System.currentTimemillis();
                                ……….
                                ………..
                                ………
                                endTime = System.currentTimemillis();
<logUtility>.log(“Time Spent in method” + this.getClass().getcurrentMethod()+ “in msec:” + (endTime-startTime); 
//assuming the log utility being used for this as well
}

  安全权限

  本章着重介绍了典型的安全或者访问权限问题,同时整合Java profiler引擎和Java应用程序。下表列出了问题和建议,以克服这些。

问题 

 问题描述 

 建议

引擎安装文件的所有者权限

如果用户没有拥有引擎/探头的安装文件的权限,Java进程执行/启动时,由于没有足够的安全权限,不能加载所需的库

文件系统上的引擎安装文件件要有“所有者权限”,类似“Java进程”的递归
例如,如果Java进程用“wasadmin”用户组启动,引擎安装文件夹和它所有的子文件夹都要归“wasadmin”所拥有。
(注意:基于UNIX平台,主要的用户ID和组都应该是相同的Java进程)
例如:chown –R <uid:Primary Group> <Agent Installation Folder> - UNIX based Platforms

引擎安装文件的执行权限

如果引擎文件只有读和写权限,引擎/探头库不能在Java进程中执行

用递归方法为探头安装文件夹指定特定的访问权限
例如: chmod 775 <探头安装文件> - (UNIX/LINUX/SOLARIS/AIX/HP-UX 平台)
读/写/执行权限 – WINDOWS平台

在Java应用程序/应用程序服务器上启用Java安全

Java应用程序启用Java安全,由于在server.policyfile 中缺少指令,profiler可能不会启动

通过在server.policy中添加下列指令,为Agent/Probe的jar文件授予所有的安全权限

例如:当整合HP Diagnostics Java Probe和WAS 6.1时,profiler不能启动,获得所有需要的指标。下面内容添加到server.policy文件中:
grant codeBase "file:/opt/MercuryDiagnostics/JavaAgent/DiagnosticsAgent/lib/../lib/probe.jar" { permission java.security.AllPermission; };

 (注意:在单独的应用程序中使用Java安全,识别所需的安全指令添加到属性文件中)

  应用程序缓存

  问题

  对于某些应用程序,缓存(无论是自定义的缓存或是分布式缓存产品)是用来提高应用程序的性能,profiler可能不会如期工作。这是由于在缓存中提高追踪和调试每一个可用对象的开销。

  由于一些追踪器和调试器在不同层中有默认的检测点,如JSP/Servlet、EJB、DAO和标准的Java架构,如STRUTS、SPRING,ORM工具,如HIBERNATE,即使没有添加一些自定义的检测点,如果在应用程序下使用巨大的对象缓存,会有很大的开销。

  推荐的解决方案

  在这种情况下,建议遵循以下两个选项之一:

  • 禁用所有默认的检测点,伴随探头/探查,依据Profiler,观察应用程序的变化。
  • 当分析应用程序时,禁用缓存,找出Java代码的瓶颈和其他地方,如数据库、外部系统等。

  另外,减少缓存的大小,使对象追踪和调试的影响变小(在大多数情况下,缓存的设置是可用的,可以配置它的大小,以及缓存的失效策略)

  J2EE服务器中,COTS产品的默认检测

  问题

  如果应用程序需要调试一些运行在JVM流程上的COTS产品,引用调试引擎,JVM可能不会启动。

  我想要和大家分享我的经验,托管在WebSphere应用服务品上,业界领先的规则引擎产品,比如,在整合Java调试器后无法启动。应用程序服务器崩溃的原因是在Java编译程序的libjvm.so库中。Profiler库中没有任何错误。没有profiler,JVM就不会崩溃。

  推荐的解决方案

  确保运行在Java流程中的COTS产品,默认没有启动调试或者监听机制。如果启用,请停掉,并运行profiler。

  检查COTS产品是否兼容profiler - 很多时候,很难得到一些关于遵循产品兼容性的文档。因此,建议找工具厂商或者COTS产品,以获得支持。

  待定的操作系统

  问题

  在某些情况下,基于UNIX操作系统(尤其是UNIX/SOLARIS/LINUX/HP-UX)的文件描述符数量的设置,会影响调试流程。

  因为调试活动会加载很多的库和二进制文件,在有探头/探查的情况下,应用程序服务器可能不会启动,正常情况下使用文件描述符极少。

  推荐的解决方案

  推荐检查当前文件描述符的限制(使用ulimit –n命令),提升系统文件描述符允许的最大值。要注意,每当profiler作用在应用程序中时,这不是要强制更改的命令,然而,在附有profiler应用程序时,在不可预料的情况下,它可以作为检测清单条目之一。

  结论

  本文想要做一个简短的调试流程,以及整合调试工具和Java应用程序时的特定问题。这里讨论的问题和补救方法是基于我的经验,和不同的Java调试工具、基于web和企业Java/J2EE应用程序,他们将作为性能架构师/工具师的检测清单,帮助他们迅速解决一些profiler问题,减少调试活动的周转时间。