lea*_*ode 14 multithreading amazon-web-services amazon-ecs aws-fargate aws-serverless
背景:我对“无服务器”概念很陌生。我正在创建一个拾取和放置应用程序。基本上,应用程序将从 40 个队列中使用/选取消息,并将这些消息发送/放置在单个传出 FIFO 队列中(以维持顺序)。该逻辑需要大约 10 个工作线程/线程在不同队列上并行运行。
请不要建议 lambda。它不适合我的用例。
我计划在 AWS ECS + fargate 中创建此应用程序。我想知道当我在 java 应用程序中使用 Fargate 来创建这 10 个线程时会出现任何问题吗?
使用fargate(这是一个无服务器概念)时多线程有什么问题吗?
Pie*_*rre 50
在物理机上,你有一定数量的
现在,不要混淆 CPU 线程(例如:每个 CPU 核心 2 个线程)和应用程序线程!这是完全不同的两件事!
然后您需要了解每个操作系统对上述 CPU/核心/线程的使用方式有所不同。它创建进程、线程,并在这些 CPU/核心/线程上使用时间片。例如,在您的笔记本电脑上,您可能只有一个 2 到 6 核的 CPU(对于 Intel 处理器,取决于 i3、i5、i7),或者在最新的 Apple M1 上有更多的 CPU。事实上,在你的笔记本电脑上,你运行浏览器,你可能运行 IDE,你可能运行 Web 服务器、应用程序服务器、docker、Excel 等等。这些是很多进程和应用程序线程。远远多于 CPU/核心/线程。操作系统 (OS) 负责拼接工作并将其放在传送带上。在 Linux 中,您可以使某些进程“很好”地让渡给其他进程,或者您可以使它们“从处理器中获取所有可能的东西”。有很多方法可以分割工作。因此,您还需要查看操作系统。
另一个例子:当我在我的开发笔记本电脑上安装 Apache Tomcat 时,Tomcat 在 JVM 上运行并启动可能包含数十个线程的线程池。然后我会在 Tomcat 服务器上安装一个应用程序,该服务器可能有一个包含 20 个线程的数据库连接池。如您所见,仅我的 Tomcat 服务器可能运行 30-40 个 Java 线程,而我的 Intel i7 笔记本电脑只有 1 个 CPU、6 个内核,并且支持超线程 = 1x6x2 = 12 个线程。
在 AWS 中,一切都是虚拟化的,因此 1 个 vCPU 不会映射到 1 个 CPU!一个vCPU实际上映射到一个核心线程。这会让人感到困惑,因为 AWS 并不在所有服务器上使用相同的 CPU。您需要查看文档以了解哪个服务器类映射到多少个线程等。例如,我相信在 Intel Xeon 处理器上,1vCPU=1 个超线程(因此,两条传送带之一通向一个核心)。但对于使用新 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 个 vCPU(约 1-2 个 cpu 线程)可以运行许多应用程序线程。只有您才能弄清楚什么太低、什么太高以及最佳点在哪里。我希望这有帮助。如果我犯了错误和/或如果我犯了太大的逻辑捷径,请随时纠正这篇文章(我也为此苦苦挣扎,所以我很高兴得到纠正)。
归档时间: |
|
查看次数: |
22846 次 |
最近记录: |