Sql-Server

將特定處理器分配給 SQL Server 2008 R2 集群實例是不是很糟糕?

  • October 13, 2017

我有一個帶有被動節點和主動節點的 SQL Server 2008 R2 故障轉移群集。伺服器在物理上是相同的。我有兩個 SQL Server 實例,一個設置使用前 3 個 NUMA 節點中的所有 CPU,另一個設置使用第 4 個 NUMA 節點中的所有 CPU。

這似乎工作正常,即使發生故障轉移,但這是一個壞主意嗎?

如果被動伺服器沒有那麼多處理器,故障轉移會發生什麼?

我不會說這是一個壞主意,但它總是不喜歡在 sql server 上觸及CPU 親和力,除非您確定問題是由於上下文切換過多(這也可能不是實際問題,而只是症狀)。

這似乎工作正常,即使發生故障轉移,但這是一個壞主意嗎?

強制關聯意味著您取消了 sql server 在調度程序之間移動程序的能力。

考慮以下範例:(使用來自 sysinternals 的 coreinfo)在 2 個插槽、12 個 CPU(24 個啟用超執行緒的邏輯 cpu)和 2 個 NUMA 節點機器上,我們每個 NUMA 節點有 12 個 CPU。

Logical to Physical Processor Map:
**----------------------  Physical Processor 0 (Hyperthreaded)
--**--------------------  Physical Processor 1 (Hyperthreaded)
----**------------------  Physical Processor 2 (Hyperthreaded)
------**----------------  Physical Processor 3 (Hyperthreaded)
--------**--------------  Physical Processor 4 (Hyperthreaded)
----------**------------  Physical Processor 5 (Hyperthreaded)
------------**----------  Physical Processor 6 (Hyperthreaded)
--------------**--------  Physical Processor 7 (Hyperthreaded)
----------------**------  Physical Processor 8 (Hyperthreaded)
------------------**----  Physical Processor 9 (Hyperthreaded)
--------------------**--  Physical Processor 10 (Hyperthreaded)
----------------------**  Physical Processor 11 (Hyperthreaded)

Logical Processor to Socket Map:
************------------  Socket 0
------------************  Socket 1

Logical Processor to NUMA Node Map:
************------------  NUMA Node 0
------------************  NUMA Node 1

請記住,調度程序不綁定到核心,SQL Server 執行自己的執行緒調度。出於某種原因,如果一個非 SQL 程序將 CPU 1 最大化,而該 CPU 1 正在調度程序 1 上執行一個執行緒,則 SQL Server 能夠將該調度程序放到任何可用的 CPU 上,例如 CPU 4。SQL Server 有自己的負載均衡器,它將移動從一個 CPU 到另一個 CPU 的執行緒。

如果您設置處理器關聯,那麼您將刪除 sql server 切換調度程序的能力。所以調度程序 1 綁定到 CPU 1,它只能在那裡執行。

我的圖書館的一些摘錄…

來自 SQL Server Professional Internals and Troubleshooting Book :

軟 NUMA 的一個常見用途是當 SQL Server 託管一個應用程序時,該應用程序具有多個具有不同查詢要求的不同使用者組。在為軟 NUMA 配置理論上的 16 處理器伺服器後,將 2 × 4 個 CPU 節點和一個 8-CPU 節點分配給第三個 NUMA 節點,接下來將三個節點的連接親和性配置到不同的埠,然後更改連接為每一類工作負載設置,使工作負載 A “關聯”到埠 x,該埠連接到第一個 NUMA 節點;工作負載 B 關聯到埠 y,該埠連接到第二個 NUMA 節點,所有其他工作負載關聯到埠 z,該埠設置為連接到第三個 NUMA 節點。

來自 Microsoft SQL Server 2008 內部書:

在某些情況下,您可能希望限制可用 CPU 的數量但不將特定調度程序綁定到單個 CPU — 例如,如果您使用多 CPU 電腦進行伺服器整合。假設您有一台執行 8 個 SQL Server 實例的 64 處理器電腦,並且您希望每個實例使用其中的 8 個處理器。每個實例都有一個不同的關聯遮罩,它指定 64 個處理器的不同子集,因此您可能有關聯遮罩值 255 (0xFF)、65280 (0xFF00)、16711680 (0xFF0000) 和 4278190080 (0xFF000000)。因為設置了關聯遮罩,所以每個實例都有調度程序與 CPU 的硬綁定。如果您想限制 CPU 的數量但仍不限制特定調度程序在特定 CPU 上執行,您可以使用以下命令啟動 SQL Server跟踪標誌 8002。這使您可以將 CPU 映射到實例,但在實例中,調度程序不綁定到 CPU。

如果要限制 SQL 實例在伺服器上使用的 CPU,請改用Windows 系統資源管理器

如果您決定使用“CPU Affinity”,一如既往地測試、測試和測試您的整個工作負載以避免任何嚴重的性能問題**。**

建議:將其保留為預設值 - 如果您弄錯了,事情會變得更糟,故障排除會更加困難!

如果被動伺服器沒有那麼多處理器,故障轉移會發生什麼?

由於 NUMA 節點調度程序不平衡,實例可能會出現性能問題

參考 :

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