春季开机冷启动

Vik*_*ikk 8 java spring openshift spring-boot

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

每当我添加一个新实例时,响应时间会短暂上升(最多约70ms),然后恢复正常.

有什么办法可以避免这种冷启动吗?我尝试通过在发送流量之前依次进行~100次卷曲呼叫来预热应用程序,但这没有用?

我是否需要具有高并发性的更好的预热脚本?有没有更好的方法来处理这个?

谢谢

小智 5

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

ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> 
Run Code Online (Sandbox Code Playgroud)

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

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


} 
Run Code Online (Sandbox Code Playgroud)


Fab*_*ano 0

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

-XX:+解锁实验虚拟机选项 -XX:+启用JVMCI -XX:+使用JVMCI编译器

另外,请确保您已使用 Spring Boot 的执行器运行状况检查 URL ( /actuator/health )在 OpenShift 中配置就绪探针。否则,您的容器可能会在准备好提供服务之前收到流量。

就绪探针确定容器是否准备好服务请求。如果容器的就绪性探测失败,端点控制器将确保容器的 IP 地址从所有服务的端点中删除。就绪探针可用于向端点控制器发出信号,表明即使容器正在运行,它也不应该从代理接收任何流量。通过配置Pod 配置的template.spec.containers.readinessprobe节来设置就绪检查。

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