内容提要
Java虚拟线程是Java中的新功能,旨在改善应用程序的并行性。然而,在评估其性能后,发现虚拟线程在云原生Java工作负载中与Open Liberty现有线程池相比并没有明显优势。虚拟线程在CPU密集型工作负载下具有较低的吞吐量,并且其内存占用可能不会导致整体内存使用的减少。此外,虚拟线程在某些用例中显示出一些意外的性能问题。正在调查这些问题的根本原因。总体而言,虚拟线程具有潜在的好处,但可能不适用于所有应用程序。
延伸解读
虚拟线程并非万能:适用场景有限
文章评估显示,虚拟线程在云原生Java工作负载中并未明显优于Open Liberty的自适应线程池。在CPU密集型任务中,虚拟线程吞吐量反而低10-40%,且内存占用可能因DirectByteBuffers等因素而增加。因此,虚拟线程更适合高并发、高延迟的I/O密集型场景,而非替代现有线程池的通用方案。
性能意外:Linux内核调度器的影响
测试发现,在2 CPU配置下运行短任务时,虚拟线程吞吐量仅为Liberty线程池的50-55%,且CPU利用率低。根本原因是Linux内核调度器与Java ForkJoinPool的交互问题,导致平台线程被挂起10-13毫秒。该问题在不同内核版本中表现不同,升级内核可能改变行为而非修复。
内存优势可能被其他因素抵消
虚拟线程的每线程内存占用较小,但在需要数百线程的典型Liberty配置中,这一优势可能被JVM其他内存使用(如DirectByteBuffers的保留)所抵消。测试中,虚拟线程有时内存使用更低,有时更高,取决于堆增长和垃圾回收时机。因此,不能假定虚拟线程一定能降低整体内存。
实践建议:谨慎评估,按需使用
基于评估,Liberty团队暂未用虚拟线程替换现有线程池,但开发者仍可在Liberty应用中使用虚拟线程。建议在采用前针对自身工作负载进行测试,特别关注CPU密集型任务和Linux内核版本可能带来的性能问题。虚拟线程的快速启动优势在突发负载下明显,但优势可能迅速消失。
Q&A
Java虚拟线程的主要优势是什么?
Java虚拟线程的主要优势在于能够有效利用系统资源,支持轻量级和可扩展的并发模型。
虚拟线程在CPU密集型工作负载下的性能表现如何?
在CPU密集型工作负载下,虚拟线程的吞吐量低于Open Liberty的线程池,表现不佳。
使用虚拟线程时需要注意哪些性能问题?
使用虚拟线程时,开发者应注意可能出现的性能问题,包括在某些用例中表现不佳和内存占用不稳定。
虚拟线程的内存占用情况如何?
虚拟线程的内存占用在某些情况下可能高于Open Liberty的线程池,且整体内存使用可能没有明显减少。
虚拟线程的启动时间与Open Liberty的线程池相比如何?
虚拟线程的启动时间优于Open Liberty的线程池,能够更快达到最大吞吐量。
在什么情况下虚拟线程可能表现更好?
虚拟线程在高并发情况下可能表现良好,尤其是在任务延迟较长和CPU数量较多的情况下。