Linux

我如何知道我的伺服器可以執行的最大執行緒數?

  • April 15, 2020

這是機器規格:

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。

引用自:https://serverfault.com/questions/1012360