我听说在线程池中保持的线程数应该低于系统的CPU核心数量,多于核心数的线程不仅会浪费资源,还可能导致性能下降。
这些说法是否正确?如果不正确,有哪些基本原则可以驳斥这些说法(特别涉及Java)?
我听说在线程池中保持的线程数应该低于系统的CPU核心数量,多于核心数的线程不仅会浪费资源,还可能导致性能下降。
这些说法是否正确?如果不正确,有哪些基本原则可以驳斥这些说法(特别涉及Java)?
这是不正确的,除非线程数远大于核心数。这样做的原因是额外的线程将意味着额外的上下文切换。但这并不是真的,因为操作系统只有在这些上下文切换有益时才会进行非强制性的上下文切换,并且额外的线程不会强制引发更多的上下文切换。
如果创建过多的线程,那么会浪费资源。但是,与创建过少的线程相比,这一点微不足道。如果创建的线程太少,意外的阻塞(如页面故障)可能导致CPU闲置,这比一些额外的上下文切换造成的任何可能的损害都要严重。
这并不完全正确,这取决于整体软件架构。保留比可用核心更多的线程是有原因的,以防一些线程被操作系统挂起,因为它们正在等待I/O完成。这可能是显式的I/O调用(例如从文件同步读取),也可能是隐式的,例如系统分页处理。
实际上,我曾在一本书中读到,将线程数保持为 CPU 核心数的两倍是一个好的做法。
对于REST API调用或者说I/O绑定操作,拥有比核心数更多的线程可以通过允许多个API请求并行处理来潜在地提高性能。然而,最佳线程数取决于各种因素,例如API请求频率、请求处理的复杂度以及服务器上可用的资源。
如果API请求处理是CPU绑定的,并且需要大量计算,则拥有太多线程可能会导致资源争用并降低性能。在这种情况下,线程数应限制为可用的核心数。
另一方面,如果API请求处理是I/O绑定的,并涉及等待来自外部资源(如数据库)的响应,则拥有更多线程可以通过允许多个请求并行处理来提高性能。
无论如何,建议进行性能测试以确定特定用例的最佳线程数,并使用响应时间、资源利用率和错误率等指标监控系统性能。