共用方式為


執行緒集區屬性

適用于:SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

Analysis Services 會針對許多作業使用多執行緒處理,藉由平行執行多個作業來改善整體伺服器效能。 為了更有效率地管理執行緒,引擎會使用執行緒集區預先配置執行緒,並加速下一個作業的執行緒可用性。

每個實例都會維護自己的一組執行緒集區。 表格式執行個體和多維度執行個體使用執行緒集區的方式不同。 例如,只有多維度執行個體使用 IOProcess 執行緒集區。 因此,本文所述的 PerNumaNode 屬性對表格式實例而言並不有意義。 在下方的 [屬性參考 ] 區段中,會針對每個屬性呼叫模式需求。

注意

NUMA 系統上的表格式部署超出本主題的範圍。 雖然表格式方案可以在 NUMA 系統上成功部署,但是表格式模型使用之記憶體中資料庫技術的效能特性在高度向上延展的架構上成效有限。 如需詳細資訊,請參閱 Analysis Services Case Study: Using Tabular Models in Large-scale Commercial Solutions (Analysis Services 案例研究:在大規模商業解決方案中使用表格式模型) 和 Hardware Sizing a Tabular Solution(調整表格式解決方案的硬體)。

執行緒管理

SQL Server Analysis Services使用多執行緒來利用可用的 CPU 資源,方法是增加平行執行的工作數目。 儲存引擎是多執行緒。 在儲存引擎內執行的多執行緒作業範例包含平行處理物件、處理發送至儲存引擎的個別查詢,或傳回查詢所要求的資料值。 公式引擎由於其評估之計算的序列本質,是單一執行緒。 每個查詢主要會在單一執行緒上執行,並要求 (且通常需要等候) 儲存引擎傳回資料。 查詢執行緒的執行時間較長,並且僅在完成整個查詢之後釋出。

根據預設,SQL Server Analysis Services會使用所有可用的邏輯處理器。 在啟動時,會將 msmdsrv.exe 處理序指派給特定處理器群組,但是經過一段時間後,便可在任何處理器群組中的任何邏輯處理器上排程執行緒。

使用大量處理器的一個副作用是當查詢和處理負載擴展到大量處理器,且對共用資料結構的競爭增加時,效能有時可能會降低。 在使用 NUMA 架構的高階系統上,特別容易發生這個問題,但在相同硬體上執行多個資料密集應用程式的非 NUMA 系統上,也可能發生這個問題。

您可以設定作業類型與一組特定邏輯處理器之間的親和性。 GroupAffinity屬性可讓您建立自訂親和性遮罩,指定要針對由 SQL Server Analysis Services 管理的每個執行緒集區類型使用哪些系統資源。

GroupAffinity 是可在用於各種工作負載的任何執行緒集區上設定的屬性:

  • ThreadPool \ Parsing \ Short 是簡短要求的剖析集區。 大小符合單一網路訊息的要求視為簡短要求。

  • ThreadPool \ Parsing \ Long 是其他不符合單一網路訊息之所有要求的剖析集區。

    注意

    您可以使用任何剖析集區中的執行緒來執行查詢。 快速執行的查詢 (例如快速探索或取消要求) 有時會立即執行,而不會排入查詢執行緒集區的佇列中。

  • ThreadPool \ Query 是執行剖析執行緒集區不會處理之所有要求的執行緒集區。 此執行緒集區中的執行緒會執行所有類型的作業,例如探索、DAX、MDX、DMX 和 DDL 命令。 A

  • 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 \ 併發 double 此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。 2.0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。

並行可用來初始化執行緒集區,會透過 Windows 的 I/O 完成通訊埠來實作。
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 節點執行緒集區,因此只有一個 IOProcess 執行緒集區供 msmdsrv.exe 處理序使用。

1 = 為每個 NUMA 節點啟用一個 IOProcess 執行緒集區。

2 = 為每個邏輯處理器啟用一個 IOProcess 執行緒集區。 每個執行緒集區中的執行緒會相似化為邏輯處理器的 NUMA 節點,並將理想的處理器設為邏輯處理器。

如需詳細資訊,請參閱< 設定 PerNumaNode 將 IO 執行緒相似化為 NUMA 節點中的處理器 >。

僅適用於多維度模型。
IOProcess \ PriorityRatio int 此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。 2 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。

僅適用於多維度模型。
IOProcess \ StackSizeKB int 此為帶正負號的 32 位元整數,可在執行緒執行時用於調整記憶體配置。 0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。

僅適用於多維度模型。
解析 \ \ 併發 double 此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。 2.0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。

並行可用來初始化執行緒集區,會透過 Windows 的 I/O 完成通訊埠來實作。
解析 \ \ GroupAffinity 字串 對應至系統上之處理器群組的十六進位值陣列,可用來設定剖析執行緒與每個處理器群組中的邏輯處理器之相似性。 您可以使用此屬性來建立自訂相似性。 此屬性預設為空白。

如需詳細資訊,請參閱< 設定 GroupAffinity 將執行緒相似化為處理器群組中的處理器 >。
解析 \ \ NumThreads int 此為帶正負號的 32 位元整數屬性,其中會定義可為冗長命令建立的執行緒數目。 0 0 表示由伺服器決定預設值。 預設行為會將 NumThreads 設定為 4 的絕對值或是邏輯處理器數目的 2 倍 (以較高者為準)。

如果將此值設定為負值,則伺服器會將該值乘以邏輯處理器的數目。 例如,若在具有 32 個邏輯處理器的伺服器上設定為 -10,最大值是 320 個執行緒。

最大值會根據您先前定義的任何自訂相似性遮罩而受限於可用的處理器。 例如,如果您已設定執行緒集區相似性使用 32 個處理器的其中 8 個,而您現在將 NumThreads 設定為 -10,執行緒集區的上限就是 10 乘以 8,即 80 個執行緒。

此執行緒集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。
解析 \ \ PriorityRatio int 此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。 0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。
解析 \ \ StackSizeKB int 此為帶正負號的 32 位元整數,可在執行緒執行時用於調整記憶體配置。 0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。
解析 \ \ 併發 double 此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。 2.0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。

並行可用來初始化執行緒集區,會透過 Windows 的 I/O 完成通訊埠來實作。
解析 \ \ GroupAffinity 字串 對應至系統上之處理器群組的十六進位值陣列,可用來設定剖析執行緒與每個處理器群組中的邏輯處理器之相似性。 您可以使用此屬性來建立自訂相似性。 此屬性預設為空白。

如需詳細資訊,請參閱< 設定 GroupAffinity 將執行緒相似化為處理器群組中的處理器 >。
解析 \ \ NumThreads int 此為帶正負號的 32 位元整數屬性,其中會定義可為簡短命令建立的執行緒數目。 0 0 表示由伺服器決定預設值。 預設行為會將 NumThreads 設定為 4 的絕對值或是邏輯處理器數目的 2 倍 (以較高者為準)。

如果將此值設定為負值,則伺服器會將該值乘以邏輯處理器的數目。 例如,若在具有 32 個邏輯處理器的伺服器上設定為 -10,最大值是 320 個執行緒。

最大值會根據您先前定義的任何自訂相似性遮罩而受限於可用的處理器。 例如,如果您已設定執行緒集區相似性使用 32 個處理器的其中 8 個,而您現在將 NumThreads 設定為 -10,執行緒集區的上限就是 10 乘以 8,即 80 個執行緒。

此執行緒集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。
解析 \ \ PriorityRatio int 此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。 0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。
解析 \ \ StackSizeKB int 此為帶正負號的 32 位元整數,可在執行緒執行時用於調整記憶體配置。 64 * 邏輯處理器數目 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。
過程 \ 併發 double 此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。 2.0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。

並行可用來初始化執行緒集區,會透過 Windows 的 I/O 完成通訊埠來實作。
過程 \ GroupAffinity 字串 對應至系統上之處理器群組的十六進位值陣列,可用來設定處理執行緒與每個處理器群組中的邏輯處理器之相似性。 您可以使用此屬性來建立自訂相似性。 此屬性預設為空白。

如需詳細資訊,請參閱< 設定 GroupAffinity 將執行緒相似化為處理器群組中的處理器 >。
過程 \ MaxThreads int 此為帶正負號的 32 位元整數,指定要包含在執行緒集區中的執行緒數目上限。 0 0 表示由伺服器決定預設值。 伺服器預設會將此值設為 64 的絕對值或是邏輯處理器數目 (以較高者為準)。 例如,在啟用超執行緒的 64 核心系統上 (導致 128 個邏輯處理器),執行緒集區最多為 128 個執行緒。

如果將此值設定為負值,則伺服器會將該值乘以邏輯處理器的數目。 例如,若在具有 32 個邏輯處理器的伺服器上設定為 -10,最大值是 320 個執行緒。

最大值會根據您先前定義的任何自訂相似性遮罩而受限於可用的處理器。 例如,如果您已設定執行緒集區相似性使用 32 個處理器的其中 8 個,而您現在將 MaxThreads 設定為 -10,執行緒集區的上限就是 10 乘以 8,即 80 個執行緒。

此執行緒集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。

如需微調執行緒集區設定的詳細資訊,請參閱《 Analysis Services 操作指南》。
過程 \ MinThreads int 此為帶正負號的 32 位元整數,指定要預先配置在執行緒集區中的執行緒數目下限。 0 0 表示由伺服器決定預設值。 預設的最小值是 1。

如果將此值設定為負值,則伺服器會將該值乘以邏輯處理器的數目。

此執行緒集區屬性所使用的實際值會在服務啟動時寫入 msmdsrv 記錄檔。

如需微調執行緒集區設定的詳細資訊,請參閱《 Analysis Services 操作指南》。
過程 \ PriorityRatio int 此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。 2 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。
過程 \ StackSizeKB int 此為帶正負號的 32 位元整數,可在執行緒執行時用於調整記憶體配置。 0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。
查詢 \ 併發 double 此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。 2.0 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。

並行可用來初始化執行緒集區,會透過 Windows 的 I/O 完成通訊埠來實作。
查詢 \ 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 操作指南》。
查詢 \ PriorityRatio int 此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。 2 此為進階屬性,除非在 Microsoft 支援人員的指導之下,否則不應隨意變更。
查詢 \ 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 資源管理員設定邏輯處理器和伺服器處理序之間的相似性。 這種方式與定義個別執行緒集區的自訂相似性相比,可更容易進行實作與管理。

如果這個方法不夠完善,您可以定義執行緒集區的自訂相似性,達成更大的精確度。 大型多核心系統 (NUMA 或非 NUMA) 會因為執行緒集區分佈於太廣泛的處理器範圍而導致降低效能,因此在這些系統上比較可能建議自訂相似性設定。 雖然您可以在具有少於 64 個邏輯處理器的系統上設定 GroupAffinity ,但受益不顯著甚至可能會降低效能。

注意

GroupAffinity受限於限制SQL Server Analysis Services所用核心數目的版本。 在啟動時,SQL Server Analysis Services會使用版本資訊和GroupAffinity屬性來計算SQL Server Analysis Services所管理之每個執行緒集區的親和性遮罩。 Standard Edition 最多可以使用 24 個核心。 如果您在具有 24 個以上核心的大型多核心系統上安裝SQL Server Analysis Services標準版,SQL Server Analysis Services只會使用其中 24 個。 如需處理器最大值的詳細資訊,請參閱 SQL Server 版本支援的功能中的跨機箱延展限制。

Syntax

每個處理器群組的值都是十六進位,而十六進位代表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

  1. 判斷處理器和處理器群組數目

    您可以 從 winsysinternals 下載 Coreinfo 公用程式

    執行 coreinfo 即可從 Logical Processor to Group Map 區段取得這項資訊, 並為每個邏輯處理器分別產生一行。

  2. 處理器的排序 (由右至左): 7654 3210

    這個範例只顯示 8 個處理器 (0 至 7),不過,處理器群組最多可以有 64 個邏輯處理器,而且企業等級的 Windows Server 最多可以有 10 個處理器群組。

  3. 針對您要使用的處理器群組計算位元遮罩

    7654 3210

    根據您要排除或包含邏輯處理器,以 0 或 1 取代此數值。 在具有八個處理器的系統上,如果您想要針對 Analysis Services 使用處理器 7、6、5、4 和 1,您的計算方式可能會如下所示:

    1111 0010

  4. 將二進位數字轉換成十六進位值

    使用計算機或轉換工具將二進位數字轉換成對應的十六進位值。 在此範例中, 1111 0010 會轉換成 0xF2

  5. 在 GroupAffinity 屬性中輸入十六進位值

    在 msmdsrv.ini 或 Management Studio 的伺服器屬性頁面中,將 GroupAffinity 設為步驟 4 中計算所得的值。

重要

設定 GroupAffinity 是包含多個步驟的手動工作。 計算 GroupAffinity時,請謹慎地檢查您的計算結果。 雖然如果整個遮罩無效,SQL Server Analysis Services會傳回錯誤,但有效和無效設定的組合會導致SQL Server Analysis Services忽略 屬性。 例如,如果位元遮罩包含額外的值,SQL Server Analysis Services會忽略設定,並使用系統上的所有處理器。 當發生這個動作時並不會出現任何錯誤或警告來提醒您,但是您可以檢查 msmdsrv.log 檔案來了解實際上是如何設定相似性。

設定 PerNumaNode 將 IO 執行緒相似化為 NUMA 節點中的處理器

若為多維度 Analysis Service 執行個體,您可以在 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),如果電腦的 NUMA 節點少於 4 個,這是作用的設定值。

Numa、處理器和執行緒集區對應映射 #1

設定 PerNumaNode=1

系統會針對每個 NUMA 節點建立 IOProcess 執行緒集區。 使用個別的執行緒集區可改善對本機資源的協調存取,例如 NUMA 節點的本機快取。

Numa、處理器和執行緒集區對應映射 #2

設定 PerNumaNode=2

此設定適用于執行大量工作負載的高階系統。 此屬性會在其最細微的層級設定 IOProcess 執行緒集區相似性,並在邏輯處理器層級建立及關聯個別的執行緒集區。

以下範例中具有 4 個 NUMA 節點及 32 個邏輯處理器的系統上,將 PerNumaNode 設為 2 會產生 32 個 IOProcess 執行緒集區。 前 8 個執行緒集區中的執行緒會相似化為 NUMA 節點 0 中的所有邏輯處理器,但會將理想的處理器設為 0、1、2,最多 7。 後 8 個執行緒集區會相似化為 NUMA 節點 1 中的所有邏輯處理器,並將理想的處理器設為 8、9、10,最多 15,依此類推。

Numa、處理器和執行緒集區對應映射 #3

在此相似性層級,排程器一律會先嘗試使用偏好的 NUMA 節點中的理想邏輯處理器。 如果邏輯處理器無法使用,排程器會選擇相同節點或相同處理器群組 (如果沒有其他執行緒可用) 中的其他處理器。 如需詳細資訊和範例,請參閱 Analysis Services 2012 Configuration settings (Wordpress Blog)(Analysis Services 2012 組態設定 (Wordpress 部落格))。

IOProcess 執行緒中的工作分配

當您考慮是否設定 PerNumaNode 屬性時,了解如何使用 IOProcess 執行緒可協助您做出更明智的決定。

請記得 IOProcess 可用於與多維度引擎中之儲存引擎查詢相關聯的 IO 工作。

當掃描區段時,此引擎會識別區段所屬的分割區,並且嘗試將區段工作加入分割區所使用的執行緒集區佇列。 一般而言,屬於分割區的所有區段都會將其工作加入相同執行緒集區的佇列。 在 NUMA 系統上,這個行為特別有利,因為分割區的所有掃描都將使用在本機配置給該 NUMA 節點之檔案系統快取中的記憶體。

下列案例的建議調整有時可以改善 NUMA 系統的查詢效能:

  • 若為低度資料分割的量值群組 (例如,只有一個資料分割),增加資料分割數目。 只使用一個資料分割會導致引擎永遠將工作排入一個執行緒集區 (執行緒集區 0) 的佇列。 加入更多分割區可讓引擎使用其他執行緒集區。

    或者,如果您無法建立其他資料分割,嘗試設定 PerNumaNode=0,這個方式可增加執行緒集區 0 可用的執行緒數目。

  • 如果是區段掃描平均分配在多個分割區中的資料庫,將 PerNumaNode 設定為 1 或 2 可以提高查詢效能,因為這樣會增加系統所使用之 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 核心系統上,顯示 Query 執行緒集區的預設值 (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)"

請注意,設定 MinThreadMaxThread 的演算法會合併系統組態,特別是處理器數目。 下列部落格文章提供如何計算值的資訊: Analysis Services 2012 Configuration settings (Wordpress Blog)(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 的內容都相同,不過,某些設定僅適用于一個模式。 屬性參考文件中會註明這些依據伺服器模式的行為差異。

另請參閱

關於進程和執行緒
多個處理器
處理器群組
SQL Server Analysis Services 作業指南