一个 c5.2xlarge 实例有 8 个 vCPU。如果我运行 os.cpu_count() (Python) 或 std::thread::hardware_concurrency() (C++),他们每个人都会在这个实例上报告 8。我认为底层硬件可能是一台更大的机器,但他们告诉我我可以使用什么,这似乎有用且正确。
但是,如果我的 ECS 任务仅请求 2048 个 CPU(2 个 vCPU),那么它仍然会从 c5.2xlarge 机器上的上述查询中获得 8 个。我的理解是,如果其他繁忙的任务正在运行,Docker 会将我的任务限制为仅使用“2 vCPU 值(value)”的 CPU。但它让我看到了整个实例。
这似乎会导致任务创建过多的线程/进程。
例如,如果我在 c5.18xlarge 实例上运行 2048 个 CPU 任务,每个任务都会认为它有 72 个可用内核。总的来说,它们都会创建太多的线程/进程;它会工作,但效率低下。
这里的最佳做法是什么?程序应该以某种方式知道他们的 ECS 任务预留吗?并根据那个创建线程/进程?这看起来不错,除非你可能没有充分使用一个实例,如果它没有充满繁忙的任务。所以我只是不确定那里什么是最佳的。
我想根本问题是 Docker 将限制使用的 CPU 总量。但它无法调整您正在使用的线程/进程数。并且使用太多或太少的线程/进程都是低效的。
见 cpu usage in ECS docs 的讨论.
另见这篇长博文:https://goldmann.pl/blog/2014/09/11/resource-management-in-docker/
最佳答案
虚拟化技术和容器之间存在巨大差异。清楚地了解这些技术将有所帮助。也就是说,如果您想在不同的环境中部署应用程序,它应该是可配置的。
我建议创建一个可选配置,它告诉应用程序它只能使用一定数量的 cpu 内核。如果未提供该值,则它会回退到自动检测。
一旦你在定义 ECS 任务时有了这个选项,你就可以提供这个可选的配置,这将解决你面临的问题。
关于amazon-web-services - 在一个 ECS 任务中创建多少个线程/进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52820909/