線程集區屬性
適用於: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium
Analysis Services 會針對許多作業使用多線程處理,藉由平行執行多個作業來改善整體伺服器效能。 為了更有效率地管理線程,引擎會使用線程集區預先配置線程,並加速下一個作業的線程可用性。
每個實例都會維護自己的一組線程集區。 表格式和多維度實例使用線程集區的方式有所差異。 例如,只有多維度實例會使用 IOProcess 線程集區。 因此,本文所述的 PerNumaNode 屬性對表格式實例來說並不有意義。 在下方的 屬性參考 一節中,會針對每個屬性呼叫模式需求。
注意
NUMA 系統上的表格式部署已脫離本主題的範圍。 雖然表格式解決方案可以在 NUMA 系統上成功部署,但表格式模型所使用的記憶體內部資料庫技術效能特性可能會對高度擴充的架構顯示有限的優點。 如需詳細資訊,請參閱 Analysis Services 案例研究:在大型商業解決方案中使用表格式模型 和 硬體大小調整表格式解決方案。
線程管理
SQL Server Analysis Services 會使用多線程,藉由增加平行執行的工作數目,利用可用的 CPU 資源。 儲存引擎是多線程。 在儲存引擎內執行的多線程作業範例包括平行處理物件,或處理已推送至儲存引擎的離散查詢,或傳回查詢所要求的數據值。 公式引擎由於所評估計算的序列本質,是單個線程。 每個查詢主要會在單一線程上執行,要求並經常等候記憶體引擎傳回的數據。 查詢線程的執行時間較長,而且只有在完成整個查詢之後才會釋出。
根據預設,SQL Server Analysis Services 會使用所有可用的邏輯處理器。 啟動時,msmdsrv.exe 進程會指派給特定處理器群組,但一段時間后,線程可以在任何處理器群組的任何邏輯處理器上排程。
使用大量處理器的一個副作用是,當查詢和處理負載分散到大量處理器和共用數據結構的爭用增加時,有時候效能會降低。 這特別是在使用 NUMA 架構的高階系統上,但也發生在在同一部硬體上執行多個數據密集應用程式的非 NUMA 系統上。
您可以在作業類型與一組特定的邏輯處理器之間設定親和性。 GroupAffinity 屬性可讓您建立自定義親和性遮罩,以指定要用於 SQL Server Analysis Services 所管理之每個線程集區類型的系統資源。
GroupAffinity 是可在用於各種工作負載的任何線程集區上設定的屬性:
ThreadPool \ 剖析 \ Short 是簡短要求的剖析集區。 符合單一網路訊息的要求會被視為簡短。
ThreadPool \ 剖析 \ Long 是不符合單一網路訊息之所有其他要求的剖析集區。
注意
來自任一剖析集區的線程可用來執行查詢。 執行快速的查詢,例如快速探索或取消要求,有時會立即執行,而不是排入查詢線程集區。
ThreadPool \ Query 是線程集區,會執行剖析線程集區未處理的所有要求。 此線程集區中的線程會執行所有類型的作業,例如 Discovers、MDX、DAX、DMX 和 DDL 命令。 一個
ThreadPool \ IOProcess 用於多維度引擎中與儲存引擎查詢相關聯的 IO 作業。 這些線程所完成的工作應該不會與其他線程有相依性。 這些線程通常會掃描分割區的單一區段,並針對區段數據執行篩選和匯總。 IOProcess 線程對 NUMA 硬體設定特別敏感。 因此,此線程集區具有 PerNumaNode 組態屬性,可用來視需要微調效能。
ThreadPool \ Process 適用於持續時間較長的儲存引擎作業,包括匯總、編製索引和認可作業。 ROLAP 儲存模式也會使用來自處理線程集區的線程。
VertiPaq \ ThreadPool 是表格式模型中執行資料表掃描的線程集區。
若要服務要求,SQL Server Analysis Services 可能會超過線程集區限制上限,如果需要額外的線程來執行工作,則要求其他線程。 不過,當線程完成執行其工作時,如果目前線程計數大於上限,則線程只會結束,而不是傳回至線程集區。
注意
超過最大線程集區計數只有在發生特定死結狀況時才會叫用保護。 為了避免超出上限的線程建立,線程會在達到上限之後逐漸建立(在短暫延遲之後)。 超過線程計數上限可能會導致工作執行速度變慢。 如果性能計數器顯示線程計數定期超出線程集區大小上限,您可能會認為線程集區大小對於系統要求的並行程度而言太小。
根據預設,線程集區大小是由 SQL Server Analysis Services 所決定,並且以核心數目為基礎。 針對 SSAS,您可以在伺服器啟動之後檢查msmdsrv.log檔案,以觀察選取的預設值。 作為效能微調練習,您可以選擇增加線程集區的大小以及其他屬性,以改善查詢或處理效能。
線程集區屬性參考
本節描述每個 SQL Server Analysis Services 實例 msmdsrv.ini 檔案中找到的線程集區屬性。 這些屬性的子集也會出現在 SQL Server Management Studio 中。
屬性會依字母順序列出。
名字 | 類型 | 描述 | 違約 | 指導 |
---|---|---|---|---|
IOProcess \ 並行 | 雙 | 雙精確度浮點值,決定在一次可排入佇列之線程數目上設定目標的演算法。 | 2.0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 |
IOProcess \ GroupAffinity | 字串 | 對應至系統上處理器群組的十六進位值陣列,用來將IOProcess線程集區中的線程親和性設定為每個處理器群組中的邏輯處理器。 | 沒有 | 您可以使用這個屬性來建立自定義親和性。 屬性預設為空白。 如需詳細資訊,請參閱 設定 GroupAffinity 將線程親和化為處理器群組中的處理器。 僅適用於多維度模型。 |
IOProcess \ MaxThreads | int | 帶正負號的 32 位整數,指定要包含在線程集區中的線程數目上限。 | 0 | 0 表示伺服器會決定預設值。 根據預設,伺服器會將此值設定為 64,或設定為邏輯處理器數目的 10 倍,以較高者為準。 例如,在具有超線程的 4 核心系統上,線程集區上限為 80 個線程。 如果您將此值設定為負值,伺服器會依邏輯處理器數目來乘以該值。 例如,當在具有 32 個邏輯處理器的伺服器上設定為 -10 時,最大值為 320 個線程。 最大值受限於您先前定義之任何自定義親和性遮罩的可用處理器。 例如,如果您已經將線程集區親和性設定為使用 32 個處理器中的 8 個,而您現在將 MaxThreads 設定為 -10,則線程集區上的上限會是 10 倍 8 或 80 個線程。 此線程集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。 如需微調線程集區設定的詳細資訊,請參閱 Analysis Services 作業指南。 僅適用於多維度模型。 |
IOProcess \ MinThreads | int | 帶正負號的 32 位整數,指定要預先配置線程集區的線程數目下限。 | 0 | 0 表示伺服器會決定預設值。 根據預設,最小值為1。 如果您將此值設定為負值,伺服器會依邏輯處理器數目來乘以該值。 此線程集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。 如需微調線程集區設定的詳細資訊,請參閱 Analysis Services 作業指南。 僅適用於多維度模型。 |
IOProcess \ PerNumaNode | int | 帶正負號的 32 位整數,決定為 msmdsrv 進程建立的線程集區數目。 | -1 | 有效值為 -1、0、1、2 -1 = 伺服器會根據 NUMA 節點數目選取不同的 IO 線程集區策略。 在少於 4 個 NUMA 節點的系統上,伺服器行為與 0 相同(系統會為系統建立一個 IOProcess 線程集區)。 在具有 4 個以上的節點的系統上,行為與 1 相同(IOProcess 線程集區會針對每個節點建立)。 0 = 停用每個 NUMA 節點線程集區,讓 msmdsrv.exe 進程只使用一個 IOProcess 線程集區。 1 = 為每個 NUMA 節點啟用一個 IOProcess 線程集區。 2 = 每個邏輯處理器一個 IOProcess 線程集區。 每個線程集區中的線程都會與邏輯處理器的NUMA節點親和化,並將理想的處理器設定為邏輯處理器。 如需詳細資訊,請參閱 設定 PerNumaNode 將 IO 線程親和化為 NUMA 節點中的處理器。 僅適用於多維度模型。 |
IOProcess \ PriorityRatio | int | 帶正負號的 32 位整數,可用來確保即使較高優先順序的佇列不是空的,有時也會執行較低優先順序的線程。 | 2 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 僅適用於多維度模型。 |
IOProcess \ StackSizeKB | int | 帶正負號的32位整數,可用來在線程執行期間調整記憶體配置。 | 0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 僅適用於多維度模型。 |
剖析 \ Long \ 並行 | 雙 | 雙精確度浮點值,決定在一次可排入佇列之線程數目上設定目標的演算法。 | 2.0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 |
剖析 \ Long \ GroupAffinity | 字串 | 對應至系統上處理器群組的十六進位值陣列,用來將剖析線程的親和性設定為每個處理器群組中的邏輯處理器。 | 沒有 | 您可以使用這個屬性來建立自定義親和性。 屬性預設為空白。 如需詳細資訊,請參閱 設定 GroupAffinity 將線程親和化為處理器群組中的處理器。 |
剖析 \ Long \ NumThreads | int | 帶正負號的 32 位整數屬性,定義可以針對長命令建立的線程數目。 | 0 | 0 表示伺服器會決定預設值。 默認行為是將 NumThreads 設定為絕對值為 4,或 2 倍的邏輯處理器數目,以較高者為準。 如果您將此值設定為負值,伺服器會依邏輯處理器數目來乘以該值。 例如,當在具有 32 個邏輯處理器的伺服器上設定為 -10 時,最大值為 320 個線程。 最大值受限於您先前定義之任何自定義親和性遮罩的可用處理器。 例如,如果您已經將線程集區親和性設定為使用 32 個處理器中的 8 個,而您現在將 NumThreads 設定為 -10,則線程集區上的上限會是 10 倍 8 或 80 個線程。 此線程集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。 |
剖析 \ Long \ PriorityRatio | int | 帶正負號的 32 位整數,可用來確保即使較高優先順序的佇列不是空的,有時也會執行較低優先順序的線程。 | 0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 |
剖析 \ Long \ StackSizeKB | int | 帶正負號的32位整數,可用來在線程執行期間調整記憶體配置。 | 0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 |
剖析 \ 簡短 \ 並行存取 | 雙 | 雙精確度浮點值,決定在一次可排入佇列之線程數目上設定目標的演算法。 | 2.0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 |
剖析 \ 簡短 \ GroupAffinity | 字串 | 對應至系統上處理器群組的十六進位值陣列,用來將剖析線程的親和性設定為每個處理器群組中的邏輯處理器。 | 沒有 | 您可以使用這個屬性來建立自定義親和性。 屬性預設為空白。 如需詳細資訊,請參閱 設定 GroupAffinity 將線程親和化為處理器群組中的處理器。 |
剖析 \ 簡短 \ NumThreads | int | 帶正負號的32位整數屬性,定義可以為簡短命令建立的線程數目。 | 0 | 0 表示伺服器會決定預設值。 默認行為是將 NumThreads 設定為絕對值為 4,或 2 倍的邏輯處理器數目,以較高者為準。 如果您將此值設定為負值,伺服器會依邏輯處理器數目來乘以該值。 例如,當在具有 32 個邏輯處理器的伺服器上設定為 -10 時,最大值為 320 個線程。 最大值受限於您先前定義之任何自定義親和性遮罩的可用處理器。 例如,如果您已經將線程集區親和性設定為使用 32 個處理器中的 8 個,而您現在將 NumThreads 設定為 -10,則線程集區上的上限會是 10 倍 8 或 80 個線程。 此線程集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。 |
剖析 \ Short \ PriorityRatio | int | 帶正負號的 32 位整數,可用來確保即使較高優先順序的佇列不是空的,有時也會執行較低優先順序的線程。 | 0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 |
剖析 \ 簡短 \ StackSizeKB | int | 帶正負號的32位整數,可用來在線程執行期間調整記憶體配置。 | 64 * 邏輯處理器 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 |
進程 \ 並行 | 雙 | 雙精確度浮點值,決定在一次可排入佇列之線程數目上設定目標的演算法。 | 2.0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 |
Process \ GroupAffinity | 字串 | 對應至系統上處理器群組的十六進位值陣列,用來將處理線程的親和性設定為每個處理器群組中的邏輯處理器。 | 沒有 | 您可以使用這個屬性來建立自定義親和性。 屬性預設為空白。 如需詳細資訊,請參閱 設定 GroupAffinity 將線程親和化為處理器群組中的處理器。 |
進程 \ MaxThreads | int | 帶正負號的 32 位整數,指定要包含在線程集區中的線程數目上限。 | 0 | 0 表示伺服器會決定預設值。 根據預設,伺服器會將此值設定為 64 的絕對值,或邏輯處理器的數目,以較高者為準。 例如,在啟用超線程的 64 核心系統上,線程集區上限為 128 個線程。 如果您將此值設定為負值,伺服器會依邏輯處理器數目來乘以該值。 例如,當在具有 32 個邏輯處理器的伺服器上設定為 -10 時,最大值為 320 個線程。 最大值受限於您先前定義之任何自定義親和性遮罩的可用處理器。 例如,如果您已經將線程集區親和性設定為使用 32 個處理器中的 8 個,而您現在將 MaxThreads 設定為 -10,則線程集區上的上限會是 10 倍 8 或 80 個線程。 此線程集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。 如需微調線程集區設定的詳細資訊,請參閱 Analysis Services 作業指南。 |
進程 \ MinThreads | int | 帶正負號的 32 位整數,指定要預先配置線程集區的線程數目下限。 | 0 | 0 表示伺服器會決定預設值。 根據預設,最小值為1。 如果您將此值設定為負值,伺服器會依邏輯處理器數目來乘以該值。 此線程集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。 如需微調線程集區設定的詳細資訊,請參閱 Analysis Services 作業指南。 |
Process \ PriorityRatio | int | 帶正負號的 32 位整數,可用來確保即使較高優先順序的佇列不是空的,有時也會執行較低優先順序的線程。 | 2 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 |
Process \ StackSizeKB | int | 帶正負號的32位整數,可用來在線程執行期間調整記憶體配置。 | 0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 |
查詢 \ 並行存取 | 雙 | 雙精確度浮點值,決定在一次可排入佇列之線程數目上設定目標的演算法。 | 2.0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 |
查詢 \ GroupAffinity | 字串 | 對應至系統上處理器群組的十六進位值陣列,用來將處理線程的親和性設定為每個處理器群組中的邏輯處理器。 | 沒有 | 您可以使用這個屬性來建立自定義親和性。 屬性預設為空白。 如需詳細資訊,請參閱 設定 GroupAffinity 將線程親和化為處理器群組中的處理器。 |
查詢 \ MaxThreads | int | 帶正負號的 32 位整數,指定要包含在線程集區中的線程數目上限。 | 0 | 0 表示伺服器會決定預設值。 根據預設,伺服器會將此值設定為絕對值為10,或將邏輯處理器數目設定為2倍,以較高者為準。 例如,在具有超線程的 4 核心系統上,線程計數上限為 16。 如果您將此值設定為負值,伺服器會依邏輯處理器數目來乘以該值。 例如,當在具有 32 個邏輯處理器的伺服器上設定為 -10 時,最大值為 320 個線程。 最大值受限於您先前定義之任何自定義親和性遮罩的可用處理器。 例如,如果您已經將線程集區親和性設定為使用 32 個處理器中的 8 個,而您現在將 MaxThreads 設定為 -10,則線程集區上的上限會是 10 倍 8 或 80 個線程。 此線程集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。 如需微調線程集區設定的詳細資訊,請參閱 Analysis Services 作業指南。 |
查詢 \ MinThreads | int | 帶正負號的 32 位整數,指定要預先配置線程集區的線程數目下限。 | 0 | 0 表示伺服器會決定預設值。 根據預設,最小值為1。 如果您將此值設定為負值,伺服器會依邏輯處理器數目來乘以該值。 此線程集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。 如需微調線程集區設定的詳細資訊,請參閱 Analysis Services 作業指南。 |
Query \ PriorityRatio | int | 帶正負號的 32 位整數,可用來確保即使較高優先順序的佇列不是空的,有時也會執行較低優先順序的線程。 | 2 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 |
Query \ StackSizeKB | int | 帶正負號的32位整數,可用來在線程執行期間調整記憶體配置。 | 0 | 除了Microsoft支持的指導下,您不應該變更的進階屬性。 |
VertiPaq \ CPU | int | 帶正負號的 32 位整數,指定要用於表格式查詢的處理器數目上限。 | 0 | 0 表示伺服器會決定預設值。 根據預設,伺服器會將此值設定為絕對值為10,或將邏輯處理器數目設定為2倍,以較高者為準。 例如,在具有超線程的 4 核心系統上,線程計數上限為 16。 如果您將此值設定為負值,伺服器會依邏輯處理器數目來乘以該值。 例如,當在具有 32 個邏輯處理器的伺服器上設定為 -10 時,最大值為 320 個線程。 最大值受限於您先前定義之任何自定義親和性遮罩的可用處理器。 例如,如果您已經將線程集區親和性設定為使用 32 個處理器中的 8 個,而您現在將 MaxThreads 設定為 -10,則線程集區上的上限會是 10 倍 8 或 80 個線程。 此線程集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。 |
VertiPaq \ GroupAffinity | 字串 | 對應至系統上處理器群組的十六進位值陣列,用來將處理線程的親和性設定為每個處理器群組中的邏輯處理器。 | 沒有 | 您可以使用這個屬性來建立自定義親和性。 屬性預設為空白。 如需詳細資訊,請參閱 設定 GroupAffinity 將線程親和化為處理器群組中的處理器。 僅適用於表格式。 |
將 GroupAffinity 設定為將線程親和化為處理器群組中的處理器
GroupAffinity 提供進階微調用途。 您可以使用 GroupAffinity 屬性來設定 SQL Server Analysis Services 線程集區和特定處理器之間的親和性;不過,對於大部分的安裝,SQL Server Analysis Services 在使用所有可用的邏輯處理器時會執行最佳效能。 因此,預設不會指定群組親和性。
如果效能測試指出需要 CPU 優化,您可能會考慮較高層級的方法,例如使用 Windows Server Resource Manager 來設定邏輯處理器與伺服器進程之間的親和性。 相較於為個別線程集區定義自定義親和性,這種方法可以比定義自定義親和性更容易實作和管理。
如果該方法不足,您可以定義線程集區的自定義親和性,以達到更高的精確度。 由於線程集區分散在過於廣泛的處理器上,在大型多核心系統(NUMA 或非 NUMA)上,更可能建議自定義親和性設定, 因為線程集區分散在太廣的處理器上。 雖然您可以在少於 64 個邏輯處理器的系統上設定 GroupAffinity,但優點是微不足道的,甚至可能會降低效能。
注意
GroupAffinity 受限於限制 SQL Server Analysis Services 所使用的核心數目的版本。 在啟動時,SQL Server Analysis Services 會使用版本資訊和 GroupAffinity 屬性,為 SQL Server Analysis Services 所管理的每個線程集區計算親和性遮罩。 標準版本最多可以使用 24 個核心。 如果您在擁有 24 個以上核心的大型多核心系統上安裝 SQL Server Analysis Services 標準版本,SQL Server Analysis Services 只會使用其中 24 個。 如需處理器最大值的詳細資訊,請參閱 SQL Server中依版本
語法
每個處理器群組的值都是十六進位,十六進位代表 SQL Server Analysis Services 在配置指定線程集區時,會先嘗試使用的邏輯處理器。
邏輯處理器
單一處理器群組內最多可以有64個邏輯處理器。 線程集區所使用的群組中每個邏輯處理器的位掩碼為 1(或 0)。 計算位掩碼之後,您接著會將十六進位值計算為 groupAffinity 的值,。
多個處理器群組
處理器群組會在系統啟動時決定。 GroupAffinity 接受逗號分隔清單中的每個處理器群組的十六進位值。 指定多個處理器群組(最高 10 個較高端系統上),您可以指定0x0來略過個別群組。 例如,在具有四個處理器群組(0、1、2、3)的系統上,您可以輸入第一個和第三個值0x0來排除群組 0 和 2。
<GroupAffinity>0x0, 0xFF, 0x0, 0xFF</GroupAffinity>
計算處理器親和性遮罩的步驟
您可以在 msmdsrv.ini 或 SQL Server Management Studio 的伺服器屬性頁中設定 GroupAffinity。
決定處理器和處理器群組的數目
您可以從 winsysinternals下載
Coreinfo 公用程式。 執行 coreinfo,從邏輯處理器到群組對應區段取得此資訊。 系統會為每個邏輯處理器產生個別行。
從右至左排序處理器:
7654 3210
此範例只顯示 8 個處理器 (0 到 7),但處理器群組最多可以有 64 個邏輯處理器,而且企業級 Windows 伺服器中最多可以有 10 個處理器群組。
計算您想要使用之處理器群組的位掩碼
7654 3210
根據您要排除或包含邏輯處理器而定,將數位取代為 0 或 1。 在具有 8 個處理器的系統上,如果您想要針對 Analysis Services 使用處理器 7、6、5、4 和 1,計算可能會像這樣:
1111 0010
將二進位數轉換成十六進位值
使用計算機或轉換工具,將二進位數轉換成其十六進位對等專案。 在我們的範例中,
1111 0010
轉換成0xF2
。在 GroupAffinity 屬性中輸入十六進位值
在 Management Studio msmdsrv.ini 或伺服器屬性頁中,將 groupAffinity 設定為步驟 4 中計算的值。
重要
設定 GroupAffinity 是包含多個步驟的手動工作。 計算 GroupAffinity時,請仔細檢查您的計算。 雖然如果整個遮罩無效,SQL Server Analysis Services 會傳回錯誤,但是有效和無效的設定組合會導致 SQL Server Analysis Services 忽略 屬性。 例如,如果位掩碼包含額外的值,SQL Server Analysis Services 會忽略設定,並在系統上使用所有處理器。 此動作發生時不會發出任何錯誤或警告,但您可以檢查msmdsrv.log檔案,以了解親和性的實際設定方式。
將 PerNumaNode 設定為將 IO 線程親和化為 NUMA 節點中的處理器
針對多維度 Analysis Services 實例,您可以在 IOProcess 線程集區上設定 PerNumaNode,以進一步優化線程排程和執行。 雖然 GroupAffinity 可識別要用於指定線程集區的邏輯處理器集,PerNumaNode 會藉由指定是否建立多個線程集區,進一步親和化至允許邏輯處理器的某些子集。
PerNumaNode 的有效值為 -1、0、1、2,如本主題 線程集區屬性參考 一節所述。
預設值 (建議)
在具有 NUMA 節點的系統上,我們建議使用 PerNumaNode=-1 的預設設定,讓 SQL Server Analysis Services 根據節點計數調整線程集區數目及其線程親和性。 如果系統少於 4 個節點,SQL Server Analysis Services 會實作 perNumaNode=0 所描述的行為,而 PerNumaNode=1 用於具有 4 個以上的節點的系統上。
選擇值
您也可以覆寫預設值,以使用另一個有效值。
設定 PerNumaNode=0
會忽略 NUMA 節點。 只有一個IOProcess線程集區,而且該線程集區中的所有線程都會與所有邏輯處理器親和化。 根據預設(其中 PerNumaNode=-1),如果電腦少於 4 個 NUMA 節點,則這是操作設定。
設定 PerNumaNode=1
IOProcess 線程集區會針對每個 NUMA 節點建立。 擁有個別線程集區可改善本機資源的協調存取,例如NUMA節點上的本機快取。
設定 PerNumaNode=2
此設定適用於執行大量工作負載的高端系統。 此屬性會在最細微的層級設定 IOProcess 線程集區親和性,並在邏輯處理器層級建立和親和化個別線程集區。
在下列範例中,在具有 4 個 NUMA 節點和 32 個邏輯處理器的系統上,將 perNumaNode
在此同質層級中,排程器一律會嘗試先在慣用NUMA節點內使用理想的邏輯處理器。 如果邏輯處理器無法使用,排程器會在相同的節點內選擇另一個處理器,如果沒有其他線程可用,則選擇在同一個處理器群組內。 如需詳細資訊和範例,請參閱 Analysis Services 2012 組態設定 (Wordpress 部落格)。
IOProcess 線程之間的工作分佈
當您考慮是否要設定 PerNumaNode 屬性時,瞭解如何使用 IOProcess 線程,可協助您做出更明智的決策。
回想一下,IOProcess 用於與多維度引擎中儲存引擎查詢相關聯的 IO 作業。
掃描區段時,引擎會識別區段所屬的數據分割,並嘗試將區段作業排入數據分割所使用的線程集區。 一般而言,屬於分割區的所有區段都會將其工作排入相同的線程集區。 在 NUMA 系統上,此行為特別有利,因為所有分割區的掃描都會使用本機配置給該 NUMA 節點之文件系統快取中的記憶體。
下列案例建議調整,有時可改善 NUMA 系統上的查詢效能:
對於數據分割不足的量值群組(例如,具有單一分割區),請增加分割區數目。 只要使用一個分割區,引擎一律會將工作排入佇列到一個線程集區(線程集區 0)。 新增更多分割區可讓引擎使用其他線程集區。
或者,如果您無法建立其他分割區,請嘗試將 PerNumaNode=0 設定為增加線程集區 0 可用的線程數目。
對於分割掃描平均分散到多個分割區的資料庫,將perNumaNode
設定為1或2可以改善查詢效能,因為它會增加系統所使用的ioProcess 線程集區總數 IOProcess。 對於具有多個分割區但只有一個大量掃描的解決方案,請嘗試設定 PerNumaNode=0,以查看其是否可改善效能。
雖然分割區和維度掃描都使用 IOProcess 線程集區,但維度掃描只會使用線程集區 0。 這可能會導致該線程集區上的負載稍微不平衡,但不平衡應該是暫時的,因為維度掃描往往非常快速且不常。
注意
變更伺服器屬性時,請記住組態選項會套用至實例上執行的所有資料庫。 選擇有利於最重要的資料庫的設定,或最大量的資料庫。 您無法在資料庫層級設定處理器親和性,也無法設定個別分割區和特定處理器之間的親和性。
如需作業架構的詳細資訊,請參閱 SQL Server Analysis Services 效能指南中的第 2.2 節,。
相依或相關的屬性
如 Analysis Services 作業指南第 2.4 節所述,如果您增加處理線程集區,您應該確定 CoordinatorExecutionMode 設定,以及 CoordinatorQueryMaxThreads 設定的值,可讓您充分利用增加的線程集區大小。
Analysis Services 會使用協調器線程來收集數據,以完成處理或查詢要求。 協調器會先針對必須觸及的每個分割區排入一個作業。 然後,每個作業都會繼續排入更多作業的佇列,視必須在分割區中掃描的區段總數而定。
CoordinatorExecutionMode 的預設值為 -4,表示每個核心平行執行 4 個作業的限制,這會限制記憶體引擎中 Subcube 要求可以平行執行的協調器作業總數。
CoordinatorQueryMaxThreads 的預設值為 16,這會限制每個分割區可以平行執行的區段作業數目。
判斷目前的線程集區設定
在每個服務啟動時,SQL Server Analysis Services 會將目前的線程集區設定輸出至msmdsrv.log檔案,包括最小和最大線程、處理器親和性遮罩和並行。
下列範例是記錄檔的摘錄,其中顯示已啟用超線程的 4 核心系統上查詢線程集區的預設設定 (MinThread=0, MaxThread=0, Concurrency=2)。 親和性遮罩是0xFF,表示 8 個邏輯處理器。 請注意,前置零會加上遮罩。 您可以忽略前置零。
"10/28/2013 9:20:52 AM) Message: The Query thread pool now has 1 minimum threads, 16 maximum threads, and a concurrency of 16. Its thread pool affinity mask is 0x00000000000000ff. (Source: \\?\C:\Program Files\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Log\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x4121000A)"
回想一下,設定 minThread 和 MaxThread 的演算法會納入系統組態,特別是處理器數目。 下列部落格文章提供如何計算值的深入解析:Analysis Services 2012 組態設定 (Wordpress 部落格)。 請注意,這些設定和行為受限於後續版本中的調整。
下列清單顯示不同處理器組合的其他同質遮罩設定範例:
8 核心系統上處理器 3-2-1-0 的相似性會導致此位掩碼:00001111,以及十六進位值:0xF
8 核心系統上處理器 7-6-5-4 的親和性會導致此位掩碼:11110000,以及十六進位值:0xF0
8 核心系統上處理器 5-4-3-2 的相似性會導致此位掩碼:00111100,以及十六進位值:0x3C
8 核心系統上處理器 7-6-1-0 的親和性會導致此位掩碼:11000011,以及十六進位值:0xC3
回想一下,在具有多個處理器群組的系統上,會在逗號分隔清單中為每個群組產生個別的同質遮罩。
關於 msmdsrv.ini
SQL Server Analysis Services 中的 msmdsrv.ini 檔案包含實例的組態設定,會影響在該實例上執行的所有資料庫。 您無法使用伺服器組態屬性,將一個資料庫的效能優化,以排除所有其他資料庫。 不過,您可以安裝多個 SQL Server Analysis Services 實例,並設定每個實例使用有利於共用類似特性或工作負載之資料庫的屬性。
所有伺服器組態屬性都會包含在 msmdsrv.ini 檔案中。 更可能修改的屬性子集也會出現在管理工具中,例如 SSMS。 但是,表格式和多維度實例的 msmdsrv.ini 內容都相同,但某些設定僅適用於單一模式。 屬性參考檔中會指出以伺服器模式為基礎的行為差異。