我想我对 Java 的虚拟线程如何由载体线程 (CT) 进行调度有很好的理解,并且默认情况下 CT 的数量与 CPU 核心的数量相匹配。
现在假设我将服务部署到 Kubernetes,并且它有 1 个核心的 CPU 请求。对于此示例,我们还假设正在调度的节点有 8 个核心。因为 Kubernetes 如何分配 CPU,我的服务将获得每个 CPU 核心时间的 1/8。
所以问题来了:服务应该有多少 CT 才能获得最佳利用率?
这不取决于你给虚拟线程的任务类型吗?
例如,您有两个处理器密集型任务,没有任何睡眠/等待时间,假设您设置 jdk.virtualThreadScheduler.parallelism = 2。 理想情况下,您将拥有 2 个 CT 来并行运行您的任务。因为您有一个 CPU,所以一次可以运行一个 CT。我们还假设每个任务需要 3 秒才能完成,并且为了进行思想实验,每个线程的 CPU 时间分配为 1 秒。另外让我们考虑CPU在线程之间切换的时间,假设是0.1秒。你最终会得到:
总共 6.5 秒。没有任何好处,就好像您只有 1 个 CT,并且在 3 秒内完成第一个任务,在 3 秒内完成第二个任务,那么您总共花费了 6.1 秒。
但是,如果您的每个任务都有 1 秒的睡眠时间,且该时间不会重叠,那么您将有大约 6.5 秒的并行运行时间和 12.1 秒的顺序运行时间。