在 Kubernetes 中使用 Java 虚拟线程的理想承载线程数

问题描述 投票:0回答:1

我想我对 Java 的虚拟线程如何由载体线程 (CT) 进行调度有很好的理解,并且默认情况下 CT 的数量与 CPU 核心的数量相匹配。

现在假设我将服务部署到 Kubernetes,并且它有 1 个核心的 CPU 请求。对于此示例,我们还假设正在调度的节点有 8 个核心。因为 Kubernetes 如何分配 CPU,我的服务将获得每个 CPU 核心时间的 1/8。

所以问题来了:服务应该有多少 CT 才能获得最佳利用率?

  • 如果 Pod 的 CPU 限制定义为 1 个核心,它将自动分配 1 个 CT,这似乎并不理想,因为它将有 8 个核心来运行线程
  • 如果没有设置 CPU 限制,则会占用节点上的核心数量,从而产生 8 个 CT。
  • 作为中间解决方案,我可以删除 CPU 限制并定义可见的 CPU 计数,从而更好地控制 CT 的数量。
java kubernetes virtual-threads
1个回答
0
投票

这不取决于你给虚拟线程的任务类型吗?

例如,您有两个处理器密集型任务,没有任何睡眠/等待时间,假设您设置 jdk.virtualThreadScheduler.parallelism = 2。 理想情况下,您将拥有 2 个 CT 来并行运行您的任务。因为您有一个 CPU,所以一次可以运行一个 CT。我们还假设每个任务需要 3 秒才能完成,并且为了进行思想实验,每个线程的 CPU 时间分配为 1 秒。另外让我们考虑CPU在线程之间切换的时间,假设是0.1秒。你最终会得到:

  1. CPU1 -> 1CT -> 1VT - 1 秒
  2. 开关0.1秒
  3. CPU1 -> 2CT -> 2VT - 1 秒
  4. 开关0.1秒
  5. CPU1 -> 1CT -> 1VT - 1 秒
  6. 开关0.1秒
  7. CPU1 -> 2CT -> 2VT - 1 秒
  8. 开关0.1秒
  9. CPU1 -> 1CT -> 1VT - 1 秒
  10. 开关0.1秒
  11. CPU1 -> 2CT -> 2VT - 1 秒

总共 6.5 秒。没有任何好处,就好像您只有 1 个 CT,并且在 3 秒内完成第一个任务,在 3 秒内完成第二个任务,那么您总共花费了 6.1 秒。

但是,如果您的每个任务都有 1 秒的睡眠时间,且该时间不会重叠,那么您将有大约 6.5 秒的并行运行时间和 12.1 秒的顺序运行时间。

© www.soinside.com 2019 - 2024. All rights reserved.