我有一个Spring Boot应用程序,它在openshift集群的docker容器中运行。在稳定状态下,有N个应用程序实例(例如N = 5),并且请求被负载平衡到这N个实例。一切运行良好,响应时间很短(〜5ms,总吞吐量约为60k)。
每添加一个新实例,响应时间就会短暂增加(约70毫秒),然后恢复正常。
有什么办法可以避免这种冷启动?我尝试通过在发送流量之前顺序进行约100次curl调用来预热应用程序,但这没有帮助吗?
我需要更好的并发性更好的预热脚本吗?有更好的方法来解决这个问题吗?
谢谢
答案 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,可以为您的利益做同样的事情。