一个 ECS 任务要创建多少 threads/processes

How many threads/processes to create in an ECS task

一个c5.2xlarge实例有8个vCPU。如果我 运行 os.cpu_count() (Python) 或 std::thread::hardware_concurrency() (C++) 他们在这个实例上各自报告 8。我假设底层硬件可能是一台更大的机器,但他们告诉我我可以使用什么,这似乎有用且正确。

但是,如果我的 ECS 任务只请求 2048 CPU (2 vCPU),那么在 c5.2xlarge 机器上它仍然会从上述查询中得到 8。我的理解是 Docker 会将我的任务限制为仅使用 CPU 的“2 vCPU 价值”,如果其他繁忙的任务正在 运行ning。但它让我看到了整个实例。

这似乎会导致任务创建太多 threads/processes。 例如,如果我在 c5.18xlarge 实例上 运行ning 2048 CPU 个任务,每个任务都会认为它有 72 个可用内核。总的来说,他们都会创造太多 threads/processes;它会工作但效率低下。

此处的最佳做法是什么?程序是否应该以某种方式知道它们的 ECS 任务预留?并据此创建 threads/processes ?这看起来不错,除非你可能没有充分使用一个实例,如果它没有充满繁忙的任务。所以我只是不确定那里的最佳选择。

我想根本问题是 Docker 会限制 CPU 的使用总量。但它无法调整您正在使用的 threads/processes 个数。使用太多或太少 threads/processes 都是低效的。

参见 cpu usage in ECS docs 的讨论。

另请参阅这篇长博客 post:https://goldmann.pl/blog/2014/09/11/resource-management-in-docker/

虚拟化技术和容器之间存在巨大差异。清楚地了解这些技术将有所帮助。也就是说,如果您想将应用程序部署在不同的环境中,它应该是可配置的。

我建议创建一个可选配置,告诉应用程序它只能使用一定数量的 cpu 核心。如果未提供该值,则它会退回到自动检测。

一旦您在定义 ECS 任务时有了这个选项,您就可以提供这个可选配置,这将解决您面临的问题。