春季启动冷启动

时间:2019-02-19 05:51:35

标签: java spring spring-boot openshift

我有一个Spring Boot应用程序,它在openshift集群的docker容器中运行。在稳定状态下,有N个应用程序实例(例如N = 5),并且请求被负载平衡到这N个实例。一切运行良好,响应时间很短(〜5ms,总吞吐量约为60k)。

每添加一个新实例,响应时间就会短暂增加(约70毫秒),然后恢复正常。

有什么办法可以避免这种冷启动?我尝试通过在发送流量之前顺序进行约100次curl调用来预热应用程序,但这没有帮助吗?

我需要更好的并发性更好的预热脚本吗?有更好的方法来解决这个问题吗?

谢谢

4 个答案:

答案 0 :(得分:0)

首先,我将尝试启用JIT compilation并比较结果。 good article in Baeldung比较了Graal的性能和默认的C1和C2 JIT编译器-您可能想对工作负载进行一些测试。基本上,运行Java应用程序时需要设置以下选项:

  

-XX:+ UnlockExperimentalVMOptions -XX:+启用JVMCI -XX:+ UseJVMCICompiler

还要确保您已经configured readiness probe in OpenShift使用Spring Boot的执行器运行状况检查URL( / actuator / health )。否则,您的容器在准备服务之前可能会收到流量。

  

准备情况探测器确定容器是否准备就绪   要求。如果就绪探针使容器失败,则端点   控制器确保容器的IP地址已从   所有服务的端点。准备就绪探针可用于发信号通知   端点控制器,即使容器正在运行,   不应从代理接收任何流量。设置准备情况检查者   配置 template.spec.containers.readinessprobe 节   吊舱配置。

最后,由NGINX或其他反向代理缓存您的响应也有帮助。

答案 1 :(得分:0)

如果在向应用程序发送请求时您的应用程序运行状况良好,但是仍然存在响应缓慢的问题,则应尝试启用分层编译

-XX:CompileThreshold -XX:TieredCompilation

通常,VM使用解释器收集有关馈送到编译器中的方法的性能分析信息。在分层方案中,除了解释器外,客户端编译器还用于生成方法的编译版本,这些方法收集有关自身的性能分析信息。

由于编译后的代码比解释后的代码要快得多,因此该程序在分析阶段的执行性能更高。

答案 2 :(得分:0)

我们的微服务面临类似的问题,为了进行热身,我们添加了一个组件

ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> 
在应用程序内部

在应用程序启动后立即调用服务,这对我们有用。 使用此解决方案,可以确保在您启动的每个实例中,在实例启动后立即加载将在有效负载中使用的所有类,并且不需要外部脚本进行调用。 外部脚本也存在问题,我们不能肯定地说调用是由新实例处理的。

@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {

    @Autowired
    YourService yourService;

    @Override
    public void onApplicationEvent(final ApplicationReadyEvent event) {

        System.out.println("ApplicationReadyEvent: application is up");
        try {
            // some code to call yourservice with property driven or constant inputs 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


} 

答案 3 :(得分:0)

在我的场景中,我模拟了100多个curl请求以初始化那些客户端池,预加载缓存或其他延迟加载程序。

我在WarmupHealthIndicator implements HealthIndicator进行这项工作,该实现实现了弹簧执行器运行状况检查端点。

最终它可以正常工作,在完成预热之前,Nginx(或其他负载平衡器)进行的任何健康检查将获得5xx状态代码,并在主体消息下方。状态升级后,没有流量会花费时间进行应用初始化。

{
  "status": "DOWN",
  "details": {
    "warmup": {
      "status": "DOWN"
    },
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 536608768000,
        "free": 395195826176,
        "threshold": 10485760
      }
    }
  }
}

此外,NGINX Plus具有付费功能slow_start,可以为您的利益做同样的事情。