簡體   English   中英

AWS ECS Fargate Memory 利用率與本地 Docker

[英]AWS ECS Fargate Memory Utilization vs Local Docker

我們正在為我們的 spring webflux java 11 微服務使用 AWS Fargate ECS 任務。我們正在使用 FROM gcr.io/distroless/java:11 java 圖像。 當我們的應用程序在本地 dockerised 並作為鏡像部署在 docker 容器中時,memory 的利用率非常高,我們可以看到堆使用率從未超過 50%

然而,當我們在 AWS Fargate 中使用相同的 dockerfile 部署相同的圖像作為 ECS 任務時,AWS Dashbaord 顯示完全不同的畫面。memory 利用率從未下降,Cloudwatch 日志根本沒有顯示內存不足問題。 在 AWS ECS 中,部署后我們進行了峰值負載測試,壓力測試之后 memory 利用率達到 94%,然后進行了 6 小時的浸泡測試。 memory 利用率仍然是 94%,沒有任何 OOM 錯誤。Memory 垃圾收集不斷發生,不讓應用程序 go OOM。但它保持在 94%

為了在本地測試應用程序的 memory 利用率,我們使用 Visual VM。 我們還嘗試使用 Amazon ECS Exec 連接到 AWS Fargate 中的遠程 ECS 任務,但正在進行中

我們在我們和其他集群中的其他微服務也看到了同樣的問題。一旦達到最大數量,它就永遠不會下降。如果有人早些時候遇到過同樣的問題,請提供幫助

編輯於 2022 年 10 月 10 日:我們使用 Amazon ECS Exec 連接到 AWS Fargate ECS 任務,結果如下

我們分析了 AWS ECS Fargate Task 的 GC 日志,可以看到消息。它使用默認 GC,即簡單 GC。 我們不斷收到“Pause Young Allocation Failure”,這意味着分配給年輕一代的 memory 不夠用,因此 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

我們做了一些與 byteArray 相關的代碼更改,在 memory 中復制了兩次,memory 確實下降了,但下降幅度不大

/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

即使在 memory 以下的完整 gc 之后也不會下降:

2022-10-09T13:39:13.460+0000][1448.505s][info][gc] GC(1961) 完全暫停(分配失敗)797M->243M(1097M) 502.836ms

一個重要的觀察結果是,在運行 inspect heap 之后,觸發了一個完整的 gc,甚至沒有清除 memory。它顯示 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) 完全暫停(堆檢查啟動的 GC)181M->119M(999M) 448.699ms

你是如何在本地運行它的?你是否為你啟動的容器設置了任何參數(cpu/內存)? 在 Fargate 上有多個級別的資源配置(任務的大小和您分配給容器的資源量 - 查看此博客了解更多詳細信息)。 另外要考慮的另一件事是,使用 Fargate,您可能會登陸一個容量 >> 容量大於您配置的任務大小的實例。 Fargate 將創建一個 cgroup,將您的容器裝箱到該大小,但一些舊程序(和 java 版本)不支持 cgroup,它們可能假設您擁有的 memory 的數量是實例上可用的 memory(您看不到)而不是配置的任務大小(和 cgroup)。

我沒有確切的答案(這不適合發表評論)但這可能是您可以探索的領域(能夠執行到容器中應該有所幫助 - ECS exec 非常適合)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM