You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至Java 21后AWS ECS Fargate任务性能测试时异常退出

ECS Fargate任务收到SIGTERM终止排查方案(Java 21 + Spring Boot 2.7.31)

针对性能测试时ECS任务自动重启、日志显示收到SIGTERM的问题,从以下几个方向排查:

  • 检查ECS停止超时配置
    Fargate默认停止超时为30秒,Spring Boot收到SIGTERM后会等待Tomcat处理完活跃请求才会退出。性能测试时请求量较大,30秒内可能无法完成所有请求的收尾,ECS会强制发送SIGKILL终止任务并重启。建议将任务定义中的stopTimeout参数调整为120秒以上,验证是否还会触发重启。

  • 排查Java 21信号处理与虚拟线程影响
    Java 21对信号处理逻辑做了调整,若你的应用启用了虚拟线程(Spring Boot 2.7.x支持虚拟线程配置),可能会干扰shutdown流程。可以临时添加spring.threads.virtual.enabled=false禁用虚拟线程,观察问题是否消失。另外,若应用中有自定义信号处理逻辑,确认是否与Java 21的信号实现兼容。

  • 跟踪Spring Boot Shutdown流程
    Spring Boot 2.7.x处理SIGTERM时会逐步关闭上下文,若存在未正确实现销毁逻辑的Bean(未实现DisposableBean或@PreDestroy),或有大量未完成的异步请求,可能导致Shutdown阻塞超时。可以添加监听日志跟踪Shutdown阶段:

    @Bean
    public ApplicationListener<ContextClosedEvent> shutdownTraceListener() {
        return event -> {
            log.info("Shutdown initiated: starting context close");
            // 可添加更多阶段日志定位阻塞点
        };
    }
    
  • 验证ALB/ELB健康检查配置
    性能测试时,若负载均衡的健康检查路径在高负载下响应变慢,超过健康检查超时时间,会被判定为不健康,ECS会终止任务重启。检查健康检查的路径、超时时间、失败阈值是否合理,比如将健康检查超时从默认的2秒调整为5秒,避免高负载下的误判。

  • 查看ECS任务终止详情
    登录AWS控制台进入ECS集群任务页面,查看终止任务的「终止原因」和「停止原因」,ECS会明确标注触发源(如健康检查失败、服务扩展策略触发等)。也可通过CLI获取详细信息:

    aws ecs describe-tasks --cluster <你的集群名称> --tasks <终止任务的ARN>
    
  • 排查JVM内存隐性压力
    虽然内存使用率看似不高,但Java 21的内存默认配置(如元空间、堆内存)与Java 11不同,可能存在GC停顿过长或隐性内存泄漏。添加JVM参数打印GC日志和堆转储:

    -Xlog:gc*:file=/var/log/gc.log:time,level,tags
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/heapdump.hprof
    

    分析日志确认是否存在内存相关问题导致服务不可用,触发任务重启。

内容的提问来源于stack exchange,提问作者ramesh silamala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:51:09