基于Java的web应用程序在一天中的特定时间运行速度会非常慢两到三次

基于Java的web应用程序在一天中的特定时间运行速度会非常慢两到三次,java,angularjs,spring,oracle,plsql,Java,Angularjs,Spring,Oracle,Plsql,问题描述:我们有一个每天有200-300人使用的web应用程序。应用程序在一天中的特定时间减慢两到三次,将其主页加载时间从6-7秒更改为11-13秒。此应用程序部署在JBoss AS 7.2上。有4-5个其他应用程序部署在同一实例(端口号)的同一作业上。这些应用程序是web服务(REST和SOAP web服务,由同一公司的其他应用程序使用,我不知道),它们使用与主应用程序相同的数据库,而主应用程序存在缓慢问题。应用程序是使用以下技术堆栈构建的: 前端:Angular JS、Angular UI

问题描述:我们有一个每天有200-300人使用的web应用程序。应用程序在一天中的特定时间减慢两到三次,将其主页加载时间从6-7秒更改为11-13秒。此应用程序部署在JBoss AS 7.2上。有4-5个其他应用程序部署在同一实例(端口号)的同一作业上。这些应用程序是web服务(REST和SOAP web服务,由同一公司的其他应用程序使用,我不知道),它们使用与主应用程序相同的数据库,而主应用程序存在缓慢问题。应用程序是使用以下技术堆栈构建的:

  • 前端:Angular JS、Angular UI、JqueryUI、JSON
  • 后端:SpringREST控制器、Java7、JDBC
  • 数据库:Oracle 11g,PL SQL
自从应用程序响应时间激增以来,只有4个月了。我们在4个月前发布了一个产品版本,其中许多数据过滤都是基于某些参数进行的。这段代码是用PL/SQL实现的。前端还进行了一些数据过滤。此版本发布后,响应时间增加。(注:在此期间,用户和数据的数量也显著增加)

到目前为止,我已经尝试通过最小化Javascript文件来提高性能,将2.8MB的DOM下载内容更改为1.2MB。我还优化了一些用于数据过滤的查询。我已经能够将主页加载时间降低到平均9-10秒。这仍然远远超出了客户的预期

我想知道如何处理这类问题,以及我应该记住哪些可能导致这类问题的事情

目前,生产jvm配置为xms:64MB、xmx:256MB。增加记忆会有帮助吗? 我应该删除PLSQL代码并编写Java代码并使用多线程吗?
在高峰时间,CPU使用率相当高,约为85-95%。许多应用程序都使用主表(cron-job,它调用java程序发送电子邮件通知),对此可以做些什么?

我现在已经解决了这个问题。根据评论和建议,我对数据库的查询进行计时,检查数据库日志并监控每天的CPU使用情况。我对应用服务器也做了同样的操作,并使用jvisualvm进行了分析

我做了一些事情,比如最小化静态内容、优化查询、删除不必要的日志记录,但重要的变化来自于改变JVM调优(堆大小-xms:1024M、-xmx:1536M和permGen:512M以及其他事情)。性能现在有了很大提高,将平均主页(登录后)更改为4到5秒(从10到13秒)


从数据库的角度来看,仍然有改进的机会。必须优化某些查询和PL SQL块。但还是比以前好多了

您必须测量系统的哪个组件使其变慢,例如数据库上的负载通常有多高,以及在变慢期间,web服务器上的处理器负载和内存使用情况,网络流量等。这将是找到罪魁祸首的第一步。您确定这是应用程序性能问题吗?如果hick up自身重复出现,则可能是由于GC碰撞造成的。开始计时查询,并使用浏览器的网络检查(在Chrome上只需按F12)执行一些配置文件。同意@UweAllner,这些测量对于缩小嫌疑范围至关重要。您可以使用JBoss的服务器访问日志来确定在减速期间是否有更大的流量。此外,如果您的商店具有良好的更改管理实践,请查看当您第一次注意到速度减慢时部署中发生的更改,可能是服务器配置更改,也可能是其他团队添加的部署。在繁忙时间监视数据库会话活动,查看会话是否在此期间出现峰值。@Uwealner谢谢!DB服务器上的CPU使用率通常为85-95%,我们没有关于应用程序性能正常时CPU使用率的静态数据。请确保没有创建太多到数据库的连接。存在一个恶性循环,当数据库变慢时,连接池试图创建新的JDBC连接,这使得情况变得更糟。您的连接池应该大小合适,并且大小应该合理。例如,min=max=DB上物理核数的10倍。