Java Webapp性能问题

时间:2012-01-19 13:51:15

标签: java performance sql-server-2008 web-applications tomcat6

我有一个完全用Java制作的Web应用程序。 Web应用程序不使用任何图形/模型框架,而是使用模型 - 视图控制器。它仅使用Servlet规范(Servlet版本2.4)。 自2001年以来开发的webapp,它非常复杂。最初,是为使用Tomcat 4.x / 5.x而构建的。实际上,在Tomcat 6.x上运行。但是,我们仍然有记忆泄漏。

在深度方面,Webapp的规范可以恢复为:

  • 使用Servlet v.2.4规范。
  • 它不使用任何框架
  • 它不使用JavaEE(非EJB)
  • 它基于JavaSE(使用Servlet)
  • 仅适用于IE 6+(因为它的年龄)

基础设施规范

实际上,webapp在三种环境中运行:

第一

  • IBM服务器(我不记得确切的模型)
  • Intel Xeon 2.4 Ghz
  • 32GB RAM
  • 1TB HDD
  • Tomcat(版本6)配置为使用8GB的RAM

第二

  • Dell服务器
  • Intel Xeon 2.0Ghz
  • 4GB RAM
  • 500GB HDD
  • Tomcat(版本5.5)配置为使用1.5GB的RAM

第三

  • Dell服务器
  • Amd Opteron 1214 2.20Ghz
  • 4GB RAM
  • 320GB HDD
  • Tomcat(版本6)配置为使用1.5GB的RAM

数据库规范

webapp使用SQL Server 2008 R2 Express Edition作为DBMS,但使用SQL Server 2008 R2 Standard Edition的第一个服务器规范的用户除外。对于连接池,该应用程序使用Apache DBCP。

问题

嗯,它有非常严重的性能问题。 Web应用程序不断减速,并且多次拒绝服务。恢复应用程序的唯一方法是重新启动Apache Tomcat服务。 在性能审计期间,我发现了几个编程问题(比如数据库连接永远不会关闭,过度使用Vector集合[而不是ArrayList])。

我想知道如何提高应用程序的性能,哪些应用程序可以帮助我监控Tomcat性能和Webapp内存使用情况。

很高兴接受所有建议。

5 个答案:

答案 0 :(得分:3)

您也可以尝试stagemonitor。它是一个开源性能监控库。它记录请求响应时间,JVM指标,请求详细信息,包括请求期间被调用方法的调用堆栈(配置文件)等。由于开销较低,您也可以在生产中使用它。

调整程序如下:

  • 使用请求仪表板识别慢速请求 request dashboard
  • 使用Request Detail Dashboard分析请求的堆栈跟踪,以了解有关慢速方法的信息
  • 深入了解您的代码并尝试优化这些慢速方法
  • 您还可以将某些指标(如吞吐量或会话数与响应时间或CPU使用率)相关联
  • 使用JVM Memory Dashboard
  • 分析堆

注意:我是stagemonitor的开发者。

答案 1 :(得分:2)

我会从一些可以帮助您分析应用程序的工具开始。由于您正在开发使用Lambda ProbeJava melody开始的webapp。

第一步是确定应用程序开始表现奇怪的条件。问自己几个问题:

  1. 应用程序启动或加班后是否会出现性能问题?
  2. 性能问题是否与客户请求的数量相关?
  3. 真正的性能问题是什么 - 服务器负载过高或内存不足(请注意它们是相关的,所以请先检查哪一个开始)
  4. 是否有任何后台进程正在执行大规模操作?它们是否计划在某个特定时间段运行?
  5. 在深入研究代码之前,尝试找一些线索。它将帮助您缩小可能的原因。

    正如Joshua Bloch在他的名为“Effective Java”的书中所述 - 性能问题很少是源代码中一些小错误的结果(当然,滥用Java结构会导致灾难)。通常原因是糟糕的系统(API)架构。

    基于我的经验的最后一个建议 - 尽量不要认为高内存消耗是坏事。 Tomcat将使用尽可能多的内存作为操作系统,JVM将让他(不超过最大设置),只要它需要更多 - Tomcat将执行垃圾收集。因此,典型的(适当的!)内存消耗图看起来像锯。如果您正在处理内存泄漏,那么图表将不断增加,但无限期。这是最经常被误解的内存泄漏,所以请记住它。

    说实话 - 我们无法帮助你。这些仅仅是指针,现在你将不得不进行广泛的研究以找出原因:)

答案 2 :(得分:1)

一般解决方案是使用分析器,例如YourKit,具有可以再现问题的实际工作负载。

我首先做的是仅CPU配置文件,仅内存配置文件,最后是CPU&一次打开内存配置文件(然后查看CPU配置文件结果)

YourKit还可以监控您的高级操作,例如Java EE资源和JDBC连接。我没有尝试过这些因为我不使用它们。 ;)

即使不是问题的原因,提高效率也是一个好主意,因为它会减少这些配置文件中的“噪音”量并使您的问题更加明显。

您可以尝试增加可用内存量,但怀疑它只会延迟问题。

答案 3 :(得分:0)

确定。所以我看到巨大的Java应用程序运行较少的配置。您应该尝试执行以下操作 -

  1. 首先将Profiler连接到您的应用程序,然后查看应用程序的哪个部分花费的时间最多。您可以使用JProfilerEclipse MAT(我个人更喜欢JProfiler)。还要尝试查看占用内存最多的对象。这将帮助您缩小到需要重写的部分,以提高性能。

  2. 一旦你看了一下内存泄漏,就更新你的应用程序以使用64位JDK(假设它已经没有这样做了)

  3. 查看您的JVM参数并对其进行优化。

答案 4 :(得分:0)

您可以尝试使用开源工具Webapp Watcher,以确定代码中性能问题的位置。

您首先要在网络应用中添加过滤器(as explained here)以记录指标,然后在WAW Analyzer工具中导入日志,并按照described in the doc步骤了解代码中潜在的性能问题在哪里。