gpt4 book ai didi

spring-webflux - AWS ECS Fargate 内存利用率与本地 Docker

转载 作者:行者123 更新时间:2023-12-05 05:33:06 25 4
gpt4 key购买 nike

我们正在为我们的 spring webflux java 11 微服务使用 AWS Fargate ECS 任务。我们正在使用 FROM gcr.io/distroless/java:11 java 图像。当我们的应用程序在本地 docker 化并作为镜像部署在 docker 容器中时,内存利用率非常高,我们可以看到堆使用率永远不会超过 50%

然而,当我们在 AWS Fargate 中使用相同的 dockerfile 部署相同的图像作为 ECS 任务时,AWS Dashbaord 显示完全不同的画面。内存利用率从未下降,Cloudwatch 日志根本没有显示内存不足问题。在 AWS ECS 中,部署后我们进行了峰值负载测试、压力测试,之后内存利用率达到 94%,然后进行了 6 小时的浸泡测试。内存利用率仍然是 94%,没有任何 OOM 错误。内存垃圾收集不断发生,不让应用程序 OOM。但它保持在 94%

为了在本地测试应用程序的内存利用率,我们使用 Visual VM。我们还尝试使用 Amazon ECS Exec 连接到 AWS Fargate 中的远程 ECS 任务,但正在进行中

我们和其他集群中的其他微服务也遇到了同样的问题。一旦达到最大数量,它就永远不会下降。如果有人之前遇到过同样的问题,请提供帮助

2022 年 10 月 10 日编辑:我们使用 Amazon ECS Exec 连接到 AWS Fargate ECS 任务,结果如下所示

我们分析了 AWS ECS Fargate 任务的 GC 日志,可以看到消息。它使用默认 GC,即简单 GC。我们不断收到“Pause Young Allocation Failure”,这意味着分配给新生代的内存不足,因此 GC 失败。

[2022-10-09T13:33:45.401+0000][1120.447s][info][gc] GC(1417) 暂停完全(分配失败)793M->196M(1093M) 410.170ms[2022-10-09T13:33:45.403+0000][1120.449s][info][gc] GC(1416) Pause Young (Allocation Failure) 1052M->196M(1067M) 460.286ms

我们做了一些与字节数组相关的代码更改,在内存中复制了两次,内存确实下降了,但下降幅度不大

/app # ps -o pid,rss
PID RSS
1 1.4g
16 16m
30 27m
515 23m
524 688
1655 4
/app # ps -o pid,rss
PID RSS
1 1.4g
16 15m
30 27m
515 22m
524 688
1710 4

即使在像下面这样的完整 gc 之后,内存也不会下降:

2022-10-09T13:39:13.460+0000][1448.505s][info][gc] GC(1961) Pause Full (Allocation Failure) 797M->243M(1097M) 502.836ms

一个重要的观察是在运行 inspect heap 之后,触发了一个完整的 gc,甚至没有清除内存。它显示 679M->149M 但 ps -o pid,rss 命令不显示丢弃, AWS Container Insights 图

2022-10-09T13:54:50.424+0000][2385.469s][info][gc] GC(1967) 完全暂停(堆检查启动的 GC)679M->149M(1047M) 448.686ms[2022-10-09T13:56:20.344+0000][2475.390s][info][gc] GC(1968) Pause Full (Heap Inspection Initiated GC) 181M->119M(999M) 448.699ms

最佳答案

你是如何在本地运行它的?你是否为你启动的容器设置了任何参数(cpu/内存)?在 Fargate 上有多个级别的资源配置(任务大小和您分配给容器的资源量 - 查看 this blog 了解更多详细信息)。另外要考虑的另一件事是,使用 Fargate,您可能会登陆一个容量 >> 容量大于您配置的任务大小的实例。 Fargate 将创建一个 cgroup,它将您的容器装箱到该大小,但一些旧程序(和 java 版本)不支持 cgroup,它们可能假设您拥有的内存量是实例上可用的内存(您看不到)而不是配置的任务大小(和 cgroup)。

我没有确切的答案(这不适合发表评论)但这可能是您可以探索的领域(能够执行到容器中应该会有所帮助 - ECS exec 非常适合)。

关于spring-webflux - AWS ECS Fargate 内存利用率与本地 Docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73914579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com