我如何知道我的服务器可以运行的最大线程数?

我如何知道我的服务器可以运行的最大线程数?

以下是机器规格:

CPU(s):                20
Thread(s) per core:    1
Core(s) per socket:    10
Socket(s):             2

根据我目前所读到的内容,这些数字意味着我可以运行 20 个并行作业,因为我有 20 个 CPU。

但是,每个 CPU 上可以运行多少个线程?

答案1

欢迎来到 ServerFault!

您有两个 CPU 插槽,即两个物理处理器。每个处理器有 10 个核心,每个核心基本上相当于一个经典的单核 CPU。每个核心一次只能运行 1 个线程,即超线程被禁用。

因此,您最多可以同时执行 20 个线程,每个 CPU/核心一个线程。这意味着 20 个单线程作业、1 个具有 20 个线程的多线程作业,或者介于两者之间的任何作业。

但这仅适用于预期始终处于 100% 忙碌状态(几乎每毫秒都在忙碌)的线程。如果您的线程要花费大量时间等待其他事情发生,系统将在您的线程等待时自动运行其他线程。

除非您处在一个针对数字运算进行高度优化的环境中,否则您无法在 100% 的时间内为自己获得所有这 20 个线程:操作系统的后台进程(守护进程)将在一定(小)时间内占用其中一些线程。ps -ef在任何现代类 Unix 系统空闲时运行(或等效运行):您将看到远超 20 个进程,每个进程至少包含一个线程,而这还只是操作系统本身。

假设通过分配硬件可用的线程数,您将充分利用系统,这可能过于简单化了优化问题。根据您具体要做的事情,您可能需要使用更多或更少的线程。例如,如果您计划执行本质上受 CPU 限制的繁重计算作业,则为您的作业分配略少于 20 个线程实际上可能会获得更好的结果,这样一两个 CPU 核心将可用于操作系统的后台任务,因此您的作业线程中断的次数会减少。

但是如果您正在设置 J2EE 服务器环境,JVM 通常会具有大量线程,其中大多数线程的大部分生命周期都在等待输入,因此在 20 CPU 系统上 J2EE 服务器的 JVM 使用的总线程数很容易远高于 20。

相关内容