SpringBoot应用刚启动时服务报大量超时的问题

1、背景

部门刚转Java时,每次项目更新线上的时候,都会报大量超时的问题。

虽然操作非常缓慢且小心,按照摘除负载、更新容器、等待一段时间、恢复负载的严格步骤来操作,Nginx那边依然会报许多的503超时告警。搞得之后每次更新线上都胆战心惊。

后来采用了在服务起来之后,自动调用所有的接口进行预热,暂时的解决了这个问题。服务更新启动后也不会再报超时的错误了。

最近在网上也看到了类似的情况,表现为应用在刚刚启动之后,前几次访问都会比较卡顿,RT都会比极高,在运行一段时间之后,就会顺畅很多了。

2、原因

看来是SpringBoot应用的通病,所以就网上搜集了一波资料,研究下具体的原因。

主要原因是JIT编译。

我们知道,想要把高级语言转变成计算机认识的机器语言有两种方式,分别是编译和解释,虽然Java转成机器语言的过程中有一个步骤是要编译成字节码,但是,这里的字节码并不能在机器上直接执行。

所以,JVM中内置了解释器(interpreter),在运行时对字节码进行解释翻译成机器码,然后再执行。

解释器的执行方式是一边翻译,一边执行,因此执行效率很低。为了解决这样的低效问题,HotSpot引入了JIT技术(Just-In-Time)。

JIT 代表即时编译(Just In Time compilation),当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提高 Java 应用的性能。

有了JIT技术之后,JVM还是通过解释器进行解释执行。但是,当JVM发现某个方法或代码块运行时执行的特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code)。然后JIT会把部分“热点代码”翻译成本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。

这也是HotSpot虚拟机的名字的由来。
在这里插入图片描述
大家理解了JIT编译的原理之后,其实可以知道,JIT优化是在运行期进行的,并且也不是Java进程刚一启动就能优化的,是需要先执行一段时间的,因为他需要先知道哪些是热点代码。

所以,在IT优化开始之前,我们的所有请求,都是要经过解释执行的,这个过程就会相对慢一些。

而且,如果你们的应用的请求量比较大的的话,这种问题就会更加明显,在应用启动过程中,会有大量的请求过来,这就会导致解释器持续的在努力工作。

一旦解释器对CPU资源占用比较大的话,就会间接的导致CPU、LOAD等飙高,导致应用的性能进一步下降。

这也是为什么很多应用在发布过程中,会出现刚刚重启好的应用会发生大量的超时问题了。

而随着请求的不断增多,JIT优化就会被触发,这就是使得后续的热点请求的执行可能就不需要在通过解释执行了,直接运行JIT优化后缓存的机器码就行了。

3、解决

那么,怎么解决这样的问题呢?

主要有两种思路:

1、提升JIT优化的效率

2、降低瞬时请求量

在提升JIT优化效率的设计上,大家可以了解一下阿里研发的JDK——Dragonwell。

这个相比OpenJDK提供了一些专有特性,其中一项叫做JwarmUp的技术就是解决JIT优化效率的问题的。

这个技术主要是通过记录Java应用上一次运行时候的编译信息到文件中,在下次应用启动时,读取该文件,从而在流量进来之前,提前完成类的加载、初始化和方法编译,从而跳过解释阶段,直接执行编译好的机器码。

除了针对JDK做优化之外,还可以采用另外一种方式来解决这个问题,那就是做预热。

很多人都听说过缓存预热,其实思想是类似的。

就是说在应用刚刚启动的时候,通过调节负载均衡,不要很快的把大流量分发给他,而是先分给他一小部分流量,通过这部分流量来触发JIT优化,等优化好了之后,再把流量调大。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你遇到 Spring Boot Admin 服务链接超时问题时,可能有以下几个原因导致: 1. 网络连接问题:首先,确保你的网络连接是正常的。尝试访问其他网站或服务,看是否能够正常连接。如果其他网站或服务也无法访问,那么问题可能是你的网络连接有问题。 2. 防火墙或代理设置:检查你的防火墙或代理设置,确保它们没有阻止你访问 Spring Boot Admin 服务。如果有必要,可以尝试禁用防火墙或代理,然后再次尝试连接。 3. 应用程序配置问题:检查你的 Spring Boot Admin 服务的配置是否正确。确保你在应用程序中正确配置了 Spring Boot Admin 的端口、路径和其他相关信息。可以查看应用程序的日志,看是否有相关的错误信息。 4. 服务启动或未运行:确保你的 Spring Boot Admin 服务已经启动并正在运行。可以检查服务的日志文件,看是否有相关的启动错误信息。如果服务启动或未运行,你需要解决启动问题并重新启动服务。 5. 版本兼容性问题:如果你使用的是较新版本的 Spring Boot Admin,而你的应用程序使用的是较旧版本的 Spring Boot,可能会导致链接超时或其他问题。确保你使用的 Spring Boot Admin 版本与你的应用程序兼容。 以上是一些可能导致 Spring Boot Admin 服务链接超时的常见原因。你可以根据具体情况逐一排查并解决问题。如果问题仍然存在,你可以提供更多的详细信息,以便我能够给出更准确的建议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值