【问题标题】:Runtime.getRuntime().availableProcessors() returning 1 even though many cores available on ECS AWSRuntime.getRuntime().availableProcessors() 返回 1 即使 ECS AWS 上有许多可用内核
【发布时间】:2019-08-30 23:32:35
【问题描述】:

我正在 AWS 的 ECS 上通过 Docker 运行任务。该任务执行一些受 CPU 限制的计算,我想并行运行这些计算。我用Runtime.getRuntime().availableProcessors() 中指定的线程数启动了一个线程池,它在我的PC 上本地运行良好。出于某种原因,在 AWS ECS 上,这始终返回 1,即使有多个内核可用。因此我的计算是串行运行的,不使用多核。

例如,现在,我有一个任务在“t3.medium”实例上运行,根据docs,它应该有 2 个内核。

当我执行以下代码时:

System.out.println("Java reports " + 
    Runtime.getRuntime().availableProcessors() + " cores");

然后在日志中显示以下内容:

Java reports 1 cores

我没有在 ECS 的任务定义中指定cpu 参数。我看到在 ECS 管理控制台中的任务列表中,它有一个“CPU”列,我的任务读取为 0。我还注意到,在实例(= VM)列表中,它将“可用 CPU”列为 2048,这可能与 VM 有 2 个内核的事实有关。

我希望我的 Java 程序能够查看 VM 必须提供的所有内核。 (当 Java 程序在没有 Docker 的计算机上运行时通常会出现这种情况)。

我该怎么做?

【问题讨论】:

  • 感谢@dokaspar - 已删除。

标签: java docker amazon-ecs


【解决方案1】:

感谢 cmets 中的 @stdunbar 为我指明了正确的方向。

编辑:感谢 cmets 中的@Imran。如果您启动大量线程,它们绝对会被安排到多个核心。这个答案只是关于让Runtime.getRuntime().availableProcessors() 返回正确的值。许多“线程池”启动的线程数与该方法返回的线程数一样多:它应该返回可用的内核数。

似乎有两种主要的解决方案,但都不是理想的:

  • 在任务定义中设置cpu 参数。例如,如果您有 2 个内核并想同时使用它们,则必须在任务定义中设置 "cpu":2048。这不是很方便,原因有两个:

    • 如果您选择更大的实例,您必须确保更新此参数。

    • 如果您希望同时运行两个任务,这两个任务都可以偶尔使用所有内核进行短期活动,AWS 不会在具有 "cpu":2048 的 2 核系统上安排两个任务。从 CPU 的角度来看,它说虚拟机是“满的”。这违背了分时(Unix 等)的理念,即每项任务都取其所需(例如,想象在台式 PC 上,如果您在双核计算机上运行 Word 和 Excel,而 Windows 不允许您启动任何其他任务,因为 Word 可能需要一个核心,而 Excel 可能也需要,所以如果另一个程序 可能需要所有同时核心,不会有足够的核心。)

  • 在 JDK 10 及更高版本中使用-XX:ActiveProcessorCount=xx JVM 选项,如here 所述。这不方便,因为:

    • 如上所述,如果您更改实例类型,则必须更改该值。

我在这里写了一篇较长的博客文章来描述我的发现:https://www.databasesandlife.com/java-docker-aws-ecs-multicore/

【讨论】:

  • IMO CPU 单元在这里是软限制。示例:当我在 task def 中给出 512 作为 CPU 单元时,ECS 服务显示 CW 中的 CPU 使用率有时会超过 100%、200% 等,您认为为什么会发生这种情况?这是否意味着我的容器使用了我提供的超过一半的核心软限制,这表明分时正在发生对吗?我认为如果给定的 EC2 所有内核都被所有 ECS 任务的软限制填满,那么它说 VM 仅在部署期间已满,但实际上,实际运行时使用情况是所有内核都没有被占用,这与我们在内存上设置的硬限制不同.让我知道你的想法。
  • 谢谢@Imran,你是绝对正确的。我在回答中添加了一个编辑来澄清。
  • -XX:+UseContainerSupport参数Runtime.getRuntime().availableProcessors()在容器环境中运行时返回正确的值。据我所知,它适用于 Java 10 及更高版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多