弹簧靴冷启动

2022-09-04 22:51:01

我有一个弹簧启动应用程序,我在一个开班集群中的docker容器中运行。在稳定状态下,应用程序有 N 个实例(假设 N=5),并且请求被负载均衡到这些 N 个实例。一切运行良好,响应时间低(约 5ms,总吞吐量约为 60k)。

每当我添加新实例时,响应时间都会短暂增加(最多约70ms),然后恢复正常。

我能做些什么来避免这种类型的冷启动?我尝试在发送流量之前按顺序进行约100个curl调用来预热应用程序,但这没有帮助?

我是否需要具有高并发的更好的预热脚本?有没有更好的方法来解决这个问题?

谢谢


答案 1

我们的微服务遇到了类似的问题,为了预热,我们添加了一个组件

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();
        }
    }


} 

答案 2

如果应用程序在向其发出请求时运行正常,但仍存在响应缓慢的问题,则应尝试启用分层编译

-XX:CompileThreshold -XX:TieredCompilation

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

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


推荐