伺服器組態:affinity mask
適用於:SQL Server
注意
SQL Server 的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 請改用 ALTER SERVER CONFIGURATION。
為了執行多工作業,Windows 有時會在不同的處理器之間移動處理序執行緒。 雖然從作業系統的觀點來看很有效率,但是在繁重的系統負載下,此活動可能會降低 SQL Server 效能,因為每個處理器快取都會重複地重新載入資料。 將處理器指派給特定的執行緒,可藉由去除處理器的重新載入,而在這些狀況下增進效能;執行緒與處理器之間的這種關聯,稱為處理器相似性。
SQL Server 透過兩個親和性遮罩選項來支援處理器親和性:affinity mask
(也稱為 CPU 親和性遮罩) 與 affinity I/O mask
。 如需 affinity I/O mask option
的詳細資訊,請參閱設定親和性 I/O 遮罩伺服器組態選項。 針對擁有 33 到 64 個處理器的伺服器之 CPU 與 I/O 親和性支援,也需要您分別使用 affinity64 遮罩與 affinity64 I/O 遮罩伺服器組態選項。
注意
擁有 33 到 64 個處理器之伺服器的相似性支援只能在 64 位元的作業系統上使用。
affinity mask
選項存在於較早的 SQL Server 版本中,可動態控制 CPU 親和性。
在 SQL Server 中,不需要重新啟動 SQL Server 執行個體,即可設定 affinity mask
選項。 當您使用 sp_configure,
時,必須在設定組態選項之後執行 RECONFIGURE
或 RECONFIGURE WITH OVERRIDE
。 使用 SQL Server Express 時,變更 affinity mask
選項需要重新啟動。
對親和性遮罩的變更會動態發生,允許視需要啟動或關閉 SQL Server 中繫結處理序執行緒的 CPU 排程器。 這會因伺服器上的條件變更而發生。 例如,若要將 SQL Server 的新執行個體新增至伺服器,可能必須對 affinity mask
選項進行調整,以便重新散發處理器負載。
對親和性位元遮罩的修改,需要 SQL Server 啟用新的 CPU 排程器,並停用現有的 CPU 排程器。 然後,新批次可在新的或剩餘的排程器上加以處理。
為了啟動新的 CPU 排程器,SQL Server 會建立新的排程器,並新增至其標準排程器的清單。 新的排程器只能用於新內送的批次。 目前批次會繼續在相同的排程器上執行。 工作者會在釋出時或建立新工作者時,合併到新的排程器。
排程器上所有的批次都完成活動並結束,才能關閉排程器。 已關閉的排程器會標示為離線,如此就不會在此排程器上排定新批次。
不論新增或移除新的排程器,只要伺服器保持運作,永久性系統工作就會繼續在排程器上執行,例如,鎖定監視、檢查點、系統工作執行緒 (處理 DTC) 及訊號處理序。 這些永久性系統工作不會動態移轉。 若要將這些系統工作的處理器負載重新散發到不同排程器上,必須重新啟動 SQL Server 執行個體。 如果 SQL Server 嘗試關閉與永久性系統工作相關聯的排程器,該工作就會繼續在離線的排程器上執行 (沒有移轉)。 此排程器會繫結到已修改之親和性遮罩中的處理器,而且不會在其於變更之前已繫結的處理器上放置任何負載。 具有多餘的離線排程器,應該不會對系統負載造成顯著影響。 如果是這樣,則需要將資料庫伺服器重新開機,才能在使用已修改之親和性遮罩所提供的排程器上重新設定這些工作。
請勿將 SQL Server 的 affinity mask
和 affinity I/O mask
組態值設為使用相同的 CPU。 如果您選擇繫結處理器來進行 SQL Server 背景工作執行緒排程和 I/O 處理,效能可能就會受到影響。 因此,請確定並未針對相同的處理器設定組態值。 相同的建議適用於 affinity64 mask
和 affinity64 I/O mask
。 為了確定 affinity mask
不會與 affinity I/O mask
重疊,RECONFIGURE 命令會驗證一般的 CPU 和 I/O 親和性是否互斥。 如果不會,即會向用戶端工作階段和 SQL Server 錯誤記錄檔回報錯誤訊息,指出不建議這樣的設定。
Msg 5834, Level 16, State 1, Line 1
The affinity mask specified conflicts with the IO affinity mask specified. Use the override option to force this configuration.
執行 RECONFIGURE WITH OVERRIDE
選項,允許 CPU 和 I/O 親和性重疊且不會互斥。
affinity I/O mask
會直接影響 I/O 親和性工作 (例如,延遲寫入器與記錄寫入器)。 如果延遲寫入器與記錄寫入器工作並未繫結,其會遵循針對其他永久性工作 (例如,鎖定監視或檢查點) 所定義的相同規則。
如果您指定嘗試對應到不存在 CPU 的親和性遮罩,RECONFIGURE
命令就會將錯誤訊息回報至用戶端工作階段和 SQL Server 錯誤記錄檔。 在此情況下,使用 RECONFIGURE WITH OVERRIDE
選項沒有作用,而且會再次回報相同的組態錯誤。
您也可以依 Windows 作業系統,從特定工作負載指派中排除 SQL Server 活動。 如果將代表處理器的位元設為 1
,SQL Server 資料庫引擎就會選取該處理器來進行執行緒指派。 當您將 affinity mask
設為 0
(預設值) 時,Microsoft Windows 排程演算法會設定執行緒的親和性。 當您將 affinity mask
設為任何非零的值時,SQL Server 親和性會將該值解譯為指定適合選取之處理器的位元遮罩。
藉由將 SQL Server 執行緒從在特定處理器上執行分離出來,Microsoft Windows 可以更有效地評估 Windows 特定處理序的系統處理。 例如,系統管理員可以在執行兩個 SQL Server 執行個體 (執行個體 A 與 B) 的 8-CPU 伺服器上,使用 affinity mask
選項來將第一組 4 個 CPU 指派到執行個體 A,並將第二組 4 個 CPU 指派到執行個體 B。若要設定 32 個以上的處理器,請同時設定 affinity mask
與 affinity64 mask
。 affinity mask
的值如下:
遮罩中的位元組 | CPU 數目 |
---|---|
1 個位元組 | 最多 8 個 CPU |
2 個位元組 | 最多 16 個 CPU |
3 個位元組 | 最多 24 個 CPU |
4 個位元組 | 最多 32 個 CPU |
若要處理 32 個以上的 CPU,請針對前 32 個 CPU 設定 4 個位元組的 affinity mask
,並針對剩餘的 CPU 設定最多 4 個位元組的 affinity64 mask
。
因為設定 SQL Server 處理器親和性是特殊作業,請僅在必要時使用。 在大部分情況下,預設的 Windows 親和性可提供最佳效能。 設定親和性遮罩時,請考量其他應用程式的 CPU 需求。 如需詳細資訊,請參閱您的 Windows 作業系統文件集。
注意
您可使用程序監視器來檢視和分析個別處理器的使用方式。
指定 affinity I/O mask
選項時,您必須搭配使用 affinity mask
組態選項。 然而,如同先前所提及,請勿同時在 affinity mask
切換開關與 affinity I/O mask
選項中啟用相同的 CPU。 對應到每個 CPU 的位元組狀態應為下列三個的其中一個:
- 同時在
affinity mask
選項和affinity I/O mask
選項中的0
。 - 在
affinity mask
選項的1
和在affinity I/O mask
選項中的0
。 - 在
affinity mask
選項的0
和在affinity I/O mask
選項中的1
。
警告
不要在 Windows 作業系統中設定 CPU 親和性,同時又在 SQL Server 中設定 affinity mask
。 這些設定嘗試達到相同的結果,如果組態不一致,可能會有無法預期的結果。 設定 SQL Server CPU 親和性時,最好使用 SQL Server 中的 sp_configure
選項。
範例
以設定 affinity mask
選項為例,如果選取處理器 1、2 與 5 為可用,並將位置 1、2、5 中的位元設為 1
,且將位元 0、3、4、6 與 7 設為 0
,就必須使用十六進位值 0x26
(或對等的十進位值 38
)。 由右至左為位元位置編號。
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
EXEC sp_configure 'affinity mask', 38;
RECONFIGURE;
GO
下表顯示 8-CPU 系統的 affinity mask
值。
十進位值 | 二進位位元遮罩 | 允許 SQL Server 執行緒的處理器數目 |
---|---|---|
1 |
00000001 |
0 |
3 |
00000011 |
0 與 1 |
7 |
00000111 |
0、1 與 2 |
15 |
00001111 |
0、1、2 與 3 |
31 |
00011111 |
0、1、2、3 與 4 |
63 |
00111111 |
0、1、2、3、4 與 5 |
127 |
01111111 |
0、1、2、3、4、5 與 6 |
255 |
11111111 |
0、1、2、3、4、5、6 與 7 |
affinity mask
選項為進階選項。 若使用 sp_configure
系統預存程序來變更設定,只有當 show advanced options
設為 1
時,才能變更 affinity mask
。 Transact-SQL RECONFIGURE
命令執行之後,新的設定會立即生效,而不需重新啟動 SQL Server 執行個體。
非統一記憶體存取 (NUMA)
使用以硬體為基礎的非統一記憶體存取 (NUMA) 且設定了 affinity mask
時,節點中的每個排程器都會繫結至自己的 CPU。 當 affinity mask
未設定時,則每個排程器都會繫結至 NUMA 節點內的 CPU 群組,而對應到 NUMA 節點 N1
的排程器可在該節點中的任何 CPU 上排程工作,但不能在與另一個節點相關聯的 CPU 上進行排程。
在單一 NUMA 節點上執行的任何作業只能使用該節點的緩衝區頁面。 若作業平行執行於多個節點的 CPU 上,則可使用任何相關節點的記憶體。
授權問題
動態相似性受到 CPU 授權的嚴格控制, SQL Server 不允許違反授權原則的任何 affinity mask
選項組態。
啟動
如果指定的親和性遮罩在 SQL Server 啟動期間或在資料庫附加期間違反授權原則,引擎層會完成啟動程序或資料庫附加/還原作業,然後將親和性遮罩的 sp_configure
執行值重設為零,以便向 SQL Server 錯誤記錄檔發出錯誤訊息。
重新設定
如果指定的親和性遮罩在執行 Transact-SQL RECONFIGURE
命令時違反授權原則,就會向用戶端工作階段和 SQL Server 錯誤記錄檔回報錯誤訊息,並要求資料庫管理員重新設定親和性遮罩。 在此情況下,不會接受任何 RECONFIGURE WITH OVERRIDE
命令。