这是机器规格:
CPU(s): 20
Thread(s) per core: 1
Core(s) per socket: 10
Socket(s): 2
根据我目前所读到的内容,这些数字意味着我可以运行 20 个并行作业,因为我有 20 个 CPU。
但是,我可以在每个 CPU 中运行多少个线程?
这是机器规格:
CPU(s): 20
Thread(s) per core: 1
Core(s) per socket: 10
Socket(s): 2
根据我目前所读到的内容,这些数字意味着我可以运行 20 个并行作业,因为我有 20 个 CPU。
但是,我可以在每个 CPU 中运行多少个线程?
欢迎来到服务器故障!
您有两个 CPU 插槽,即两个物理处理器。每个处理器有 10 个内核,每个内核本身基本上相当于一个经典的单核 CPU。每个内核一次只能运行 1 个线程,即禁用超线程。
因此,您最多可以有 20 个并行执行的线程,每个 CPU/内核一个线程。这可能意味着 20 个单线程作业、1 个具有 20 个线程的多线程作业,或者介于两者之间的任何内容。
但这仅适用于那些预计会一直 100% 忙于工作的线程,几乎是它们生命中的每一毫秒。如果您的线程将花费大量时间等待其他事情发生,那么系统将自动能够在您的线程等待时运行其他线程。
除非您处于一个针对数字运算进行了高度优化的环境中,否则您不会在 100% 的时间内为自己获得所有这 20 个线程:操作系统的后台进程(守护进程)将占据其中的一些在某些(小)时间内。在任何现代类 unix 系统空闲时运行
ps -ef
(或等效):您将看到超过 20 个进程,每个进程至少包含一个线程,而这仅适用于操作系统本身。假设您将通过准确分配硬件可用的线程数来充分利用系统,可能会过度简化优化问题。根据您正在做什么,您可能希望使用更多或更少的线程。例如,如果您计划执行本质上受 CPU 限制的繁重计算作业,您实际上可能会通过为您的作业分配略少于 20 个线程来获得更好的结果,这样一到两个 CPU 内核仍可用于操作系统的后台任务,因此您的工作线程将不那么频繁地被中断。
但是如果你在搭建一个J2EE服务器环境,JVM通常会有大量的线程,其中大部分会花费大部分时间等待输入,所以J2EE服务器的JVM使用的线程总数在一个20-CPU 系统很容易超过 20。