一个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”的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/
答案 0 :(得分:3)
虚拟化技术与容器之间存在巨大差异。对这些技术有清楚的了解将有所帮助。话虽如此,如果您想在不同的环境中部署应用程序,则该应用程序应该是可配置的。
我建议创建一个可选的配置,告诉应用程序它只能使用一定数量的cpu内核。如果未提供该值,则它将退回到自动检测。
定义ECS任务后,一旦有了此选项,便可以提供此可选配置,以解决您面临的问题。