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

ter*_*789 8 linux central-processing-unit multi-threading concurrency parallel-computing

这是机器规格:

CPU(s):                20
Thread(s) per core:    1
Core(s) per socket:    10
Socket(s):             2
Run Code Online (Sandbox Code Playgroud)

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

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

tel*_*coM 10

欢迎来到服务器故障!

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

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

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

除非您处于针对数字运算进行了高度优化的环境中,否则您不会在 100% 的时间内获得所有这 20 个线程:操作系统的后台进程(守护进程)将占用其中的一些线程在某些(一小部分)时间里。ps -ef在任何现代类 UNIX 系统空闲时运行(或同等系统):您将看到超过 20 个进程,每个进程至少包含一个线程,而这仅适用于操作系统本身。

假设您将通过准确分配硬件可用的线程数来充分利用系统,这可能过于简化了优化问题。根据您正在执行的操作,您可能需要使用更多或更少的线程。例如,如果您正在规划本质上受 CPU 限制的繁重计算作业,则通过为作业分配略少于 20 个的线程实际上可能会获得更好的结果,以便一两个 CPU 核心仍可用于操作系统的后台任务,这样你的工作线程就会更少被中断。

但如果你正在搭建J2EE服务器环境,JVM通常会拥有大量的线程,而且其中大多数线程的大部分生命都在等待输入,因此J2EE服务器的JVM上使用的线程总数20 个 CPU 的系统很容易远远高于 20 个。

  • 您的任务显然受 I/O 限制。但您错误地认为线程发生在单个 CPU 内。经典的单线程进程一次只能使用一个CPU;多线程进程更复杂,但可以在多个 CPU 上并行执行,最多可达其拥有的 CPU 数量。如果一个进程是多线程的,它的线程将“自然地”共享该进程的内存空间,因此在进程内将数据从一个线程传递到另一个线程将很容易。进程彼此之间的分离更加严格:它们需要操作系统的进程间通信服务来共享内存。 (2认同)
  • 是的,你理解正确。例如,当单线程进程充分利用单核时,“top”命令会将进程的“%CPU”值显示为 100%。多线程进程可以显示高于 100% 的百分比,因为它的线程正在使用多个核心。值为 400% 表示该进程至少有 4 个线程,平均而言,需要 4 个 CPU 核心的全部容量才能在最后一次统计刷新间隔(默认情况下通常为 1 秒)运行该进程。 (2认同)