簡體   English   中英

AWS ECS Fargate 和多線程

[英]AWS ECS Fargate and multi threading

背景:我是“無服務器”概念的新手。 我正在創建一個拾取和放置應用程序。 基本上,應用程序將從 40 個隊列中消費/挑選消息,並將這些消息發送/放置在單個傳出 FIFO 隊列中(以保持序列)。 該邏輯需要大約 10 個工作線程/線程在不同隊列上並行運行。

請不要建議 lambdas。 它不適合我的用例。

我計划在 AWS ECS + fargate 中創建這個應用程序。 我想知道當我將 fargate 用於我的 java 應用程序時會不會有任何問題,它將創建這 10 個線程。

使用fargate(這是一個無服務器概念)時,多線程有什么問題嗎??

使用 fargate,您只能為每個任務創建以下 vCPU 和 memory 配置

512 (0.5 GB), 1024 (1 GB), 2048 (2 GB) - Available cpu values: 256 (.25 vCPU)

1024 (1 GB), 2048 (2 GB), 3072 (3 GB), 4096 (4 GB) - Available cpu values: 512 (.5 vCPU)

2048 (2 GB), 3072 (3 GB), 4096 (4 GB), 5120 (5 GB), 6144 (6 GB), 7168 (7 GB), 8192 (8 GB) - Available cpu values: 1024 (1 vCPU)

Between 4096 (4 GB) and 16384 (16 GB) in increments of 1024 (1 GB) - Available cpu values: 2048 (2 vCPU)

Between 8192 (8 GB) and 30720 (30 GB) in increments of 1024 (1 GB) - Available cpu values: 4096 (4 vCPU)

如您所見,最大 vCPU 計數為 4

假設 1 個 vCPU 是物理 CPU 核心上的 1 個超線程(基於此答案),您可以輕松地運行應用程序的 4 個線程。

使用 10 個線程,即使在最強大的 Farget 設置上,也可能很困難(假設日志運行、CPU 密集型線程)。

盡管如此,一旦您的應用程序運行起來,就可以相對容易地測試這一點。

在物理機上,你有一定數量的

  • CPU(例如:筆記本電腦上的 1 個 CPU 或服務器上的 4 個 CPU),
  • 每個 CPU 有 Y 個核心(例如:6 個核心),
  • 每個核心都可能執行超線程(通常每個核心 2 個線程)。 將 CPU 核心線程想象成通向核心的傳送帶:當一條傳送帶為空時,核心可以處理另一條傳送帶上要處理的東西。 在大多數架構(如 Intel)中,每個 CPU 內核都有兩個線程(傳送帶)。 當然,如果您的傳送帶滿載(如果您正在運行一項非常密集的任務),那么就會產生轉換成本。 我相信亞馬遜的新 CPU Graviton 每個核心有 1 個線程(沒有超線程)。 因此,您需要專門查看每個服務器實例,以了解每個核心有多少線程。

現在,不要混淆 CPU 線程(例如:每個 CPU 核心 2 個線程)和應用程序線程! 這是兩個完全不同的東西!

然后您需要了解每個操作系統以不同的方式使用上述 CPU/核心/線程。 它在這些 CPU/內核/線程上創建進程、線程並使用時間片。 例如,在您的筆記本電腦上,您可能只有一個具有 2 到 6 核的 CPU(對於 Intel 處理器,取決於 i3、i5、i7),或者在最新的 Apple M1 上多一點。 In reality, on your laptop, you run your browser, you might run an IDE, you might run a web server, an application server, docker, Excel, whatever else. 這些是大量的進程和應用程序線程。 遠遠超過 CPU/內核/線程。 是操作系統 (OS) 拼接工作並將其放在傳送帶上。 在 Linux 中,您可以使某些進程“很好地”讓給其他進程,或者您可以讓它們從處理器中“盡其所能”。 有很多方法可以分割工作。 因此,您還需要查看操作系統。

Another example: when I install Apache Tomcat on my development laptop, Tomcat runs on a JVM and starts thread pools which might contain dozens of threads. 然后我會在 Tomcat 服務器上安裝一個應用程序,該服務器可能有一個包含 20 個線程的數據庫連接池。 如您所見,僅我的 Tomcat 服務器可能運行 30-40 個 Java 線程,而我的 Intel i7 筆記本電腦只有 1 個 CPU,6 個內核,並支持超線程 = 1x6x2 = 12 個線程。

在 AWS 中,一切都是虛擬化的,因此 1 個 vCPU 不會 map 到 1 個 CPU。 vCPU 實際上映射到一個核心線程。 這讓人感到困惑,因為 AWS 並非在所有服務器上都使用相同的 CPU,您需要查看文檔以查看哪個服務器 class 映射到哪個線程數。 等等,例如,我相信在 Intel Xeon 處理器上,1vCPU=1 HyperThread(所以。兩條傳送帶之一通向一個核心),但是對於使用新 Graviton CPU 的服務器(我認為它有一個線程每個 CPU 內核)。 你得到一個核心。

最后,在 AWS Fargate 中,您指定 CPU 單元。 其中 1024 個單元 = 1 個 vCPU。 這很難在心理上處理,但想想操作系統時間片如何處理以及您的筆記本電腦當前如何運行很多(可能是數百個)進程和線程,但只有 1 個 CPU 和幾個內核。 以與 CPU 單元相同的方式思考它:您獲得了 CPU 的一部分。 或者把它想象成你可以訪問通往核心的傳送帶之一:如果你將 cpu 單位設置為 1024,你會得到相當於“1 個核心”的值。 請注意,實際上,它實際上比這更好,因為 AWS 正在打包這些傳送帶,所以我的示例有點“不穩定”(但我想你明白了)。

現在,如果您將 docker 容器/任務設置為僅使用 256 或 512 個 cpu 單元(通向核心的一條傳送帶的四分之一或一半),那么您可以在 fargate 的 ECS 容器上運行多少線程? 這很難說,因為這取決於你在做什么。 如果您正在解決使用 cpu 線程的數學密集型問題,您可能無法運行太多的應用程序線程。 但是,如果您正在運行一個等待很多時間的應用程序服務器(等待來自數據庫的響應、等待來自用戶的請求等),那么您可以增加線程數。

最后,您可能希望對應用程序進行負載測試。 如果你放置了太多線程,你的應用程序將花費大量時間,從一個線程切換到另一個線程(這樣對所有線程都是公平的)並且你的應用程序會爬網。 如果你把它設置得太低,你就會把容量留在桌子上。 唯一確定的方法是測試它並找到最佳位置。

你不應該犯的錯誤:

  • 認為 1 個物理 CPU = 1 個 vCPU(完全不是這種情況,更有可能 = 1 個 cpu 線程),
  • 認為 1 個核心 = 2 個線程(並非總是如此,取決於 cpu 架構和其他東西,但可能是 1 個或 2 個線程,需要查看 AWS 文檔以查找確切值),
  • 認為 1 個應用程序線程 = 1 個 CPU 線程(這些是完全不同的東西),
  • 認為如果您有 1 個 CPU 線程,那么您只能運行單線程應用程序(完全不是這種情況)。

請記住,1 個 vCPU(約 1-2 個 cpu 線程)可以運行許多應用程序線程。 只有你才能弄清楚什么太低,什么太高,以及甜蜜點在哪里。 我希望這有幫助。 如果/我犯了錯誤和/或如果我犯了太大的邏輯捷徑,請隨時糾正這篇文章(我也為此苦苦掙扎,所以我很高興得到糾正)。

Fargate 將支持多線程,只要任務定義和容器定義有用於添加線程的資源

AWS Fargate 是容器編排系統。

假設您已將 java 應用程序容器化。 您可以執行以下操作

  • 定義一個 Fargate 集群
  • 定義 Fargate 服務
  • 使用您的 java docker 容器定義 Fargate 任務
  • 配置您的服務以在您的集群中啟動 3 個 Fargate 任務

推理

由於您需要 10 個線程,因此每個任務(容器)最多可以有4 hyperthreads ,正如@marcin 提到的那樣。 所以3個任務應該可以解決問題。

暫無
暫無

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

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