Sql-Server

無法理解創建的 MaxWorkers 和 CPU 使用率之間的相關性

  • March 20, 2021

我有一個奇怪的問題,我無法理解:

在我64 Logical processors擁有maxworkers1472 的伺服器上,一天中有一個高峰期,workers created可以說超過 maxworkers 可用。範圍1800-1900在該持續時間的某個地方。

從我能理解和看到的情況來看,在那段時間裡發生了一陣阻塞。許多更新命令會阻塞自己的程序,而 UPDATE 會在幾分鐘內阻塞其他插入和選擇。

然而,CPU 不會增加並保持穩定在 30% 的平均水平。當可用的工人用盡時,CPU 是否應該不飆升至 100% 或至少遠高於 30%?或者那些等待執行緒甚至不在調度程序上?

請幫我理解,謝謝

創建的 MaxWorkers 與 CPU 使用率之間的相關性

我強烈建議您閱讀Thread and Task Architecture Guide文件。我將引用一些相關部分:

關於更高數量的worker以及maxworkers和CPU之間的關係:

在非常繁忙的 SQL Server 數據庫引擎上,可能會看到許多活動任務超出了保留執行緒設置的限制。這些任務可能屬於不再使用的分支,並且處於瞬態,等待清理。

關於您遇到的障礙:

如果您懷疑存在性能問題,則可能不是工作執行緒的可用性。原因更可能是諸如 I/O 之類導致工作執行緒等待的原因。

關於請求相互阻塞時 CPU 消耗不超過 30%:

當工作人員的時間片到期且不再處於活動狀態時,相應的任務將被置於 RUNNABLE 狀態的 FIFO 隊列中,直到它再次移動到 RUNNING 狀態,假設該任務不需要訪問在時刻,例如閂鎖或鎖,在這種情況下,任務將被置於 SUSPENDED 狀態而不是 RUNNABLE 狀態,直到這些資源可用為止。

這是一個工作人員可以處於的狀態列表(來自sys.dm_os_workers)。除非它處於RUNNING狀態,否則它沒有使用 CPU,因此,您可能同時存在的請求比您預期的 1472 更多,看看它們是否實際上沒有使用 CPU。

工人狀態。可以是以下值之一:

INIT = Worker 目前正在初始化。

RUNNING = Worker 目前正在非搶占式或搶占式執行。

RUNNABLE = 工作人員已準備好在調度程序上執行。

SUSPENDED = 工作人員目前處於掛起狀態,等待事件向其發送信號。

如何診斷您的情況

考慮到這一點,您應該檢查是否存在阻塞其他請求所需的其他資源(例如磁碟、網路)導致的瓶頸。Paul Randal 的文章SQL Server Wait Statistics(或者請告​​訴我它的痛處……)有一個很棒的查詢來檢索有關可能導致伺服器出現問題的資訊。在您假設問題是工人數量之前,我建議您在伺服器上執行該診斷。

不確定我是否理解您所說的“創建一小時的工人”的意思,不清楚這些工人能活多久,所以我們不知道有多少人同時存在。

執行緒正在等待或工作。如果它正在工作,它正在使用 cpu,如果它正在等待(等待物理 IO,等待釋放鎖……),那麼它會被掛起,並在所需資源可用時將其放入可執行隊列。可執行隊列計劃在可用時使用 CPU。可以把它想像成一個等待程序睡著了,會被它的等待完成喚醒。你通常會有很多等待執行緒,因為你會有很多空閒連接,這些不會在可執行隊列中,所以不會使用 CPU。

一些資源預計會更快。當執行緒無法獲取該資源時,它不會進入睡眠狀態,而是會執行自旋鎖,這意味著它正在積極地對 cpu 進行某些操作,然後再次檢查資源。這種等待會在 CPU 上花費時間。

閱讀https://www.sqlshack.com/sql-server-spinlocks/了解更多詳情。

引用自:https://dba.stackexchange.com/questions/287355