分析并优化 n 层应用程序
n 层 Web 应用程序的典型问题与其他应用程序无异:启动时间过长、整体性能较差、无法解决某些具体问题以及应用程序故障。尽管引起其中任何一种问题的原因有很多,但是下面的小节将介绍一些比较常见的原因,帮助了解如何改善现有应用程序的性能。
引起性能问题的原因有很多种,比如应用程序的实现方式、应用程序的操作系统、系统使用的远程资源,或者所有这些因素的结合。Heisenberg 的测不准原理(uncertainty principle)告诉我们,对系统执行检查会改变系统的行为,但这并不表示不应使用手头的所有工具解决性能问题,或是想尽办法提升和优化性能(即使当前性能足够满足需要)。
对架构和代码同时执行检查
很多性能问题常常和应用程序架构有关,而不是由具体的代码问题引起的。大量调用外部资源会浪费应用程序的时间,同时影响其他使用相同资源的应用程序的性能。类似地,使用 XML 之类的标准格式对数据交换非常有益,但是如果应用程序执行重复的或过量的转换,那么这样做将对性能造成负面影响。
检查使用 EJB 技术的方式
Enterprise JavaBean (EJB) 技术是 Java 2 Platform, Enterprise Edition (J2EE) 容器内的一个托管组件。该容器为管理资源、事务和并行性之类的内容提供了自动支持,但是也会为应用程序引入大量负载负荷。
为了缩短系统启动时间并降低整体负荷,应尽可能使用非持久性会话 bean,而不应使用实体 bean(将自动维护状态信息)。一般而言,应当尽量使用无状态会话 bean 而不是有状态会话 bean(参见 参考资料 中的 “Java EE 最佳实践”,了解如何使用各种类型的 bean 以及其他内容)。
问题识别
如果应用程序的性能从整体上来看比较差,那么应激活日志记录功能来通过日志消息时间戳识别发生问题的位置。日志记录功能肯定会影响性能,但是如果通过一致的方式记录日志,那么这种影响将均匀分布到整个应用程序中。还可以使用性能监视软件(将在 后面的小节 中讨论)识别问题所在,或使用标准的系统监视软件识别与系统资源限制相关的性能问题。
解决与资源相关的瓶颈问题
对于 J2EE 应用程序来说,数据库访问和响应性是一个常见的问题来源。本节将识别您所使用的数据库驱动程序,并了解是否可以使用其他性能更好的备选方法。
在数据库一端,检查 Java Database Connectivity (JDBC) 驱动程序正在发出的查询,以了解当前发出的调用是否过多,或者调用本身是否为最佳调用。对数据库执行检查,看看是否可以通过调优提高正在发出的 SQL 语句的性能。简单的数据库端问题,比如磁盘变慢或索引丢失,常常是引起问题的真正原因。
使用性能监视工具
大多数应用服务器提供了内部性能管理软件,可以使用它获得关于整个应用程序的详细信息,并且它对性能的影响也非常小。例如,WebSphere Application Server 提供了一个 Performance and Diagnostic Advisor,该工具在应用服务器的 JVM 进程上运行,对整个系统的影响也很有限。类似地,IBM Tivoli? Performance Viewer 提供的性能顾问程序运行在应用服务器的 JVM 中并收集 Performance Monitoring Infrastructure (PMI) 数据,这些数据可以帮助识别非最佳应用服务器设置和特定的应用程序问题。
使用可用的系统监视工具
所有 UNIX 系统都提供了 ps 和 vmstat 之类的工具,通过它们提供进程和虚拟内存统计信息。可用于识别进程所用资源的开源工具,也可用于所有 UNIX 系统。这类工具可同时用于运行应用服务器的系统和数据库之类的远程资源。比如,高虚拟内存使用率表示系统仅需增加一些内存来提升性能。类似地,持续升高的内存使用率表示应当解决内存泄漏问题。