繁体   English   中英

java中线程池的负载均衡

[英]Load balancing for thread pool in java

免责声明:这与不一样。

有些任务会同时消耗网络和 CPU。 有时性能会影响网络,有时会影响 CPU。 因此,取决于我需要在程序运行之前无法精确设置的不同线程数。 理想情况下,每个任务都应该记录它的时间(和一些其他参数),如果时间增加 -> 线程池减少线程,否则当任务更快完成时 -> 线程数应该增加。

当然,应该有防止持续负载平衡的保护:例如,当系统添加 1 个线程并删除它时,由于任务时间发生变化,因此一次又一次地重复此操作。

java是否提供类似的东西?

目前在 Java 中,线程非常昂贵,直接一对一映射到宿主 OS 线程。 它们会影响内存使用和 CPU 使用。 所以我们通常将线程数限制在几个,通常大致是内核数左右。 所以现在增加/减少线程池的大小不太可能有意义。

Project Loom中的虚拟线程

听起来您的场景非常适合来自Project Loom项目的虚拟线程纤维)。 许多虚拟线程映射到单个主机操作系统线程。

在今天的 Java 线程中,如果 Java 代码阻塞,主机操作系统线程就会阻塞。 不会对该线程执行进一步的工作。 对于虚拟线程,当 Java 代码阻塞时,虚拟线程会从其分配的主机操作系统线程中卸载,并“停放”。 当该代码最终返回并因此需要进一步执行时,它会被挂载到另一个主机操作系统线程上。 这种虚拟线程的停放和挂载比主机操作系统线程的阻塞/解除阻塞快得多。 虚拟线程对内存和 CPU 的影响要小得多。 因此,我们可以在传统硬件上同时运行数千甚至数百万个线程。

在您的工作负载可能上升或下降的场景中,Project Loom 中的虚拟线程设施将自动管理线程池和调度。 您应该毫不费力地看到吞吐量大大提高。

一些警告:

  • 便宜的线程仍然可以做昂贵的事情。 因此,您可能需要管理或限制特定的并发任务,以避免耗尽内存或使其他资源负担过重。
  • 虚拟线程仅对阻塞的任务有意义。 这意味着最常见的 Java 工作。 但是对于完全受 CPU 限制的任务,例如几乎没有日志记录的视频编码/解码、存储 I/O、网络 I/O 等,您将坚持使用传统的 Java 线程。
  • 在某些情况下,您的任务中的特定内容可能会在被阻止时阻止停车。 您可以选择稍微更改您的代码以使虚拟线程从“固定”到主机操作系统线程。 在 Loom 的初始版本中可能尤其如此。 这种情况现在在预发布的 Loom 中是不稳定的,所以我们需要随时了解变化。

虚拟线程和其他 Project Loom 功能在 Java 19 中作为预览功能提供,现在提供实验性构建。

有关更多信息,请参阅 Project Loom 团队成员(例如 Ron Pressler 和 Alan Bateman)的文章、演示文稿和采访。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM