最近發現一台SQLServer服務器CPU使用率中,有4個CPU心很繁忙,6個CPU核心卻很空閒,由於是SQLServer 2019標準版,猜測到可能是跟虛擬機的CPU授權數有關。
這台機器是筆者從Infrastructure部門接到的乾淨的虛擬機,然後自己安裝的數據庫,數據庫本身沒有對CPU有任何限制,當時並沒有注意這個細節,從任務管理器中可以看到虛擬機的CPU是10個邏輯核心(processer)對應10個socket(針腳),也就是在創建虛擬機的時候,以多個每個socket 1 個核心的方式分配的CPU資源
CPU資源分配方式大概類似如下:從ESXi控制枱中看,分配CPU的時候,有兩個因素,總的CPU核心數,以及每個Socket的核心數。個人猜測當時創建虛擬機的Infrastructure部門同事認為這樣效率更高,虛擬機的CPU,從多個物理CPU每個CPU貢獻1個核心的方式,這種方式跟分配1個Socket的10個核心,同樣都是10個CPU核心的虛擬機,對於SQLServer來説,可以是天差地別的。
參考微軟官方的文檔中的説明,對於標準版的SQLServer,最多可以使用4個Socket或者32個核心,以兩者中的下線為準,也就是説,10個Socket10核心的CPU,即便10個CPU沒有超出32,但是Socket的上限4,這種情況下也只能使用4個CPU
https://learn.microsoft.com/en-us/sql/sql-server/compute-capacity-limits-by-edition-of-sql-server?view=sql-server-ver15
然後檢查SQLServer啓動日誌,果不其然,中間有一條提醒:
SQLServer detected 10 sockets with 1 cores per scokect and 1 logical processers per socket, 10 total logical processers; using4 logical processers based on SQL Server licensing.
這就説明了一開始的現象:有4個CPU心很繁忙,6個CPU核心卻很空閒,實際上SQLServer服務僅使用了4個CPU,其他6個CPU資源因為licensing的原因並沒有使用到。
SQLServer標準版對於CPU的使用,受限於“Limited to lesser of 4 sockets or 32 cores”,因此在創建虛擬機分配CPU資源的時候,一定要了解到這個規則,不要超過4個Sockets,否則Socket超出4的CPU無法利用。