gpt4 book ai didi

performance - spring mvc + wildfly + postgresql 性能调优

转载 作者:行者123 更新时间:2023-12-03 16:54:20 25 4
gpt4 key购买 nike

我花了很多时间试图找出导致我的应用程序运行非常缓慢的原因,也许有人会帮助我检查问题所在。

版本:

spring mvc: 4.2.5.RELEASE

hibernate :4.3.11.Final

spring-data-jpa: 1.8.2.RELEASE

野蝇:10

PostgreSQL 服务器:9.4

操作系统:Debian GNU/Linux 7.9 (wheezy)

服务器配置:VPS,1 个进程,4GB RAM

关于我的应用:

带有静态 JSP 登录页面、信息页面和重定向到私有(private)区域的登录的简单 Web 应用程序。公共(public)页面是静态的,首先在登录期间查询数据库,然后尝试获取已登录用户的内容。

问题是什么:

当我浏览配置如下的页面时:

<http auto-config="true"> 
<intercept-url pattern="/" access="permitAll"/>
<intercept-url pattern="favicon.ico" access="permitAll"/>
<intercept-url pattern="/login/**" access="permitAll"/>
<intercept-url pattern="/info" access="permitAll"/>
...
</http>

没问题,一切都在他飞行中加载,没有停顿。它工作顺利。当我在/login 上发帖(将我重定向到/main),然后当我在每个这样配置的网站上导航时:

<intercept-url pattern="/main/**" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/statistic/**" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />

有一些极端的延迟,有时甚至长达 1 分钟。

hibernate 配置

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!-- Configure the entity manager factory bean -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="pl.portal.model"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaProperties">
<props>
<!-- <prop key="hibernate.dialect">pl.portal.sql.ProjectPsqlDialect</prop> -->
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.enable_lazy_load_no_trans">true</prop>
<prop key="hibernate.jdbc.use_streams_for_binary">false</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
<prop key="hibernate.connection.characterSet">UTF-8</prop>

</props>
</property>
</bean>

任何人都可以提示我如何确定导致延迟的原因吗?在我的浏览器中检查 webinspect ->/admin,大小 7,89KB,大小:54 秒(每个 js 或 css 不超过 100 毫秒)

编辑2:删除了线程转储的无效片段,粘贴了在应用程序上调用操作 /admin 后启动的线程的完整转储。线程耗时 61s

Thread dump

visualvm 控制台上的线程: enter image description here

最佳答案

造成这种延迟的原因有很多,下面列出了一些最常见的原因。

  1. 线程正在等待锁定。
  2. 数据库性能问题。
  3. CPU 密集型任务。
  4. 网络延迟

网络延迟 在您的情况下可以排除网络服务器和客户端之间的问题,因为您提到静态页面和页面资源(如 CSS)的服务器响应时间以毫秒为单位。

对于其他事情,VisualVM 等远程管理系统是找出导致延迟的原因以及哪个进程占用大量 CPU 时间的最佳工具。您也可以使用 JProfiler 等商业分析器,但 VisualVm 也可以完美地完成这项工作。

要连接到 ViusalVM,您需要访问您的服务器并添加 JMX options在 JAVA_OPTS 或您选择的任何位置并重新启动 Web 应用程序。

等待锁定的线程 - 可能有一段代码中有一个同步方法锁定静态字段。如果该方法让我们假设处理数据库查询大约需要 5 秒。并且有 10 个请求在排队。然后最后一个请求将在 50 秒或更长时间内处理。

如何检测这种瓶颈情况?

你可以遍历代码,找出所有获取锁的地方,并添加一些调试日志。但是,如果问题不在您的代码中并且可能是由某些第三方库引起的怎么办?

我曾经遇到过这样一种情况,当日志文件滚动时,Logger(log4j 库)会阻塞所有线程(大约 10 秒)。代码审查无法检测到这种情况。

分析器来拯救。VisualVM 可能是检测线程锁定引起的延迟的最佳分析器。这是您可以执行的操作。

  1. 监控线程。
  2. 当您看到许多线程处于阻塞状态时。
  3. 进行线程转储。
  4. 分析线程转储以查看导致此问题的函数并相应地解决问题。

enter image description here

CPU 密集型任务 - 如果进程占用大量 CPU 时间,它也会导致延迟。同样,您可以使用 VisualVM 的采样器 并找出哪个线程占用的 CPU 时间最多。

希望这能帮助您找到延误的原因!

关于performance - spring mvc + wildfly + postgresql 性能调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45954036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com