共用方式為


執行緒集區屬性

Analysis Services 為許多作業使用多執行緒處理,透過平行執行多個作業改善整體伺服器效能。為了更有效率地管理執行緒,Analysis Services 使用執行緒集區預先配置執行緒和促進下個作業的執行緒可用性。

每個 Analysis Services 執行個體維護一組自己的執行緒集區。表格式和多維度執行個體使用執行緒集區的方式有重大差異。最重要的差異是只有多維度方案才使用 IOProcess 執行緒集區。因此,本主題中描述的 PerNumaNode 屬性,對表格式執行個體沒有意義。

本主題包含下列章節:

  • Thread Management in Analysis Services

  • Thread Pool Property Reference

  • Set GroupAffinity to affinitize IO threads to logical processors in a processor group

  • Set PerNumaNode to create multiple IOProcess thread pools affinitized to a NUMA node

  • Determine current thread pool settings

  • Dependent or Related Properties

  • About MSMDSRV.INI

[!附註]

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

Analysis Services 中的執行緒管理

Analysis Services 使用多執行緒處理,透過增加平行執行的工作數,利用可用的 CPU 資源。儲存引擎是多執行緒。在儲存引擎內執行的多執行緒作業範例包含平行處理物件、處理發送至儲存引擎的個別查詢,或傳回查詢所要求的資料值。公式引擎由於其評估之計算的序列本質,是單一執行緒。每個查詢主要在單一執行緒上執行要求,而且經常等候儲存引擎傳回的資料。查詢執行緒有比較長時間的執行,在整個查詢完成之後才釋放。

依預設,在 SQL Server 2012 (含) 以後版本,Analysis Services 會使用所有可用的邏輯處理器,在執行較高 Windows 和 SQL Server 版本的系統上可使用多達 640 個邏輯處理器。啟動時,msmdsrv.exe 處理序將指派給特定處理器群組,不過在一段時間後,執行緒可排程在任何處理器群組中的任何邏輯處理器上執行。

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

若要減少此問題,您可以在 Analysis Services 作業類型和一組特定的邏輯處理器之間設定相似性。GroupAffinity 屬性可讓您建立自訂相似性遮罩,指定哪個系統資源用於 Analysis Services 所管理的每一個執行緒集區類型。

在用於各種 Analysis Services 工作負載的下列五個執行緒集區上,可設定自訂相似性:

  • Parsing \ Short 是簡短要求的剖析集區。可納入單一網路訊息的要求被視為簡短要求。

  • Parsing \ Long 是單一網路訊息容納不下的所有其他要求的剖析集區。

    [!附註]

    來自任一個剖析集區的執行緒都可用來執行查詢。快速執行的查詢 (例如快速 Discover 或 Cancel 要求) 有時會立即執行,而非排入 Query 執行緒集區的佇列。

  • Query 執行緒集區會執行剖析執行緒集區未處理的所有要求。這個執行緒集區中的執行緒會執行所有作業類型,例如 Discover、DAX、MDX、DMX 和 DDL 命令。

  • IOProcess 用於多維度引擎中與儲存引擎查詢相關聯的 IO 作業。這些執行緒完成的工作應該沒有其他執行緒的相依性。這些執行緒通常會掃描資料分割的單一區段,並在區段資料上執行篩選和彙總。IOProcess 執行緒對 NUMA 硬體組態特別敏感。因此,這個執行緒集區有視需要用來微調效能的 PerNumaNode 組態屬性。

  • Process 是用於比較長時間執行的儲存引擎作業,包括彙總、索引和認可作業。ROLAP 儲存模式也會使用來自處理執行緒集區的執行緒。

[!附註]

雖然 Msmdsrv.ini 有 VertiPaq 區段中的執行緒集區設定,但是 VertiPaq\ThreadPool\GroupAffinity 和 ThreadPool\CPUs 於此處刻意未記載。這些屬性目前不作用,保留供日後使用。

針對服務要求,Analysis Services 可能超過執行緒集區上限,要求執行工作所需的額外執行緒。不過,當執行緒完成執行工作時,如果目前的執行緒數目大於上限,執行緒會直接結束,而不是傳回給執行緒集區。

[!附註]

超過執行緒集區計數上限這種保護方式,只有在某些死結情況發生時才會叫用。若要避免失控的執行緒建立超過上限,執行緒在達到這個上限之後會逐步 (在一小段延遲之後) 建立。超過執行緒計數上限可能會導致工作執行速度變慢。如果效能計數器顯示執行緒計數經常超出執行緒集區大小上限,您可以將其視為執行緒集區大小對系統要求的並行程度太小的指標。

根據預設,執行緒集區大小是由 Analysis Services 所決定,並以核心數目為基礎。您可以在伺服器啟動之後檢查 msmdsrv.log 檔案,觀察選取的預設值。做為效能微調的練習,您可以選擇增加執行緒集區的大小以及其他屬性,以便改善查詢或處理效能。

執行緒集區屬性參考

本節描述每個 Analysis Services 執行個體 msmdsrv.ini 檔案中找到的執行緒集區屬性。這些屬性的子集也會出現在 SQL Server Management Studio。

屬性是依照字母順序列出。

名稱

型別

描述

預設值

指引

IOProcess \ Concurrency

double

此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。

2.0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

並行是用來初始化執行緒集區,而執行緒集區實作是使用 Windows 的 IO 完成連接埠。如需詳細資料,請參閱<I/O 完成連接埠>。

僅適用於多維度模型。

IOProcess \ GroupAffinity

string

對應至系統上之處理器群組的十六進位值陣列,可用來設定 IOProcess 執行緒集區中的執行緒與每個處理器群組中的邏輯處理器之相似性。

您可以使用此屬性建立自訂相似性。此屬性預設是空的。

如需詳細資訊,請參閱<Set 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 節點,理想的處理器則設為邏輯處理器。

如需詳細資訊,請參閱<Set PerNumaNode>。

僅適用於多維度模型。

IOProcess \ PriorityRatio

int

此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。

2

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

僅適用於多維度模型。

IOProcess \ StackSizeKB

int

此為帶正負號的 32 位元整數,可在執行緒執行時用於調整記憶體配置。

0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

僅適用於多維度模型。

Parsing \ Long \ Concurrency

double

此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。

2.0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

並行是用來初始化執行緒集區,而執行緒集區實作是使用 Windows 的 IO 完成連接埠。如需詳細資料,請參閱<I/O 完成連接埠>。

Parsing \ Long \ GroupAffinity

string

對應至系統上之處理器群組的十六進位值陣列,可用來設定剖析執行緒與每個處理器群組中的邏輯處理器之相似性。

您可以使用此屬性建立自訂相似性。此屬性預設是空的。

如需詳細資訊,請參閱<Set GroupAffinity>。

Parsing \ Long \ NumThreads

int

此為帶正負號的 32 位元整數屬性,其中會定義可為冗長命令建立的執行緒數目。

0

0 表示伺服器會決定預設值。預設行為是將 NumThreads 設定為絕對值 4,或設定為邏輯處理器數目的 2 倍 (以較高者為準)。

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

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

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

Parsing \ Long \ PriorityRatio

int

此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。

0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

Parsing \ Long \ StackSizeKB

int

此為帶正負號的 32 位元整數,可在執行緒執行時用於調整記憶體配置。

0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

Parsing \ Short \ Concurrency

double

此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。

2.0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

並行是用來初始化執行緒集區,而執行緒集區實作是使用 Windows 的 IO 完成連接埠。如需詳細資料,請參閱<I/O 完成連接埠>。

Parsing \ Short \ GroupAffinity

string

對應至系統上之處理器群組的十六進位值陣列,可用來設定剖析執行緒與每個處理器群組中的邏輯處理器之相似性。

您可以使用此屬性建立自訂相似性。此屬性預設是空的。

如需詳細資訊,請參閱<Set GroupAffinity>。

Parsing \ Short \ NumThreads

int

此為帶正負號的 32 位元整數屬性,其中會定義可為簡短命令建立的執行緒數目。

0

0 表示伺服器會決定預設值。預設行為是將 NumThreads 設定為絕對值 4,或設定為邏輯處理器數目的 2 倍 (以較高者為準)。

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

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

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

Parsing \ Short \ PriorityRatio

int

此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。

0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

Parsing \ Short \ StackSizeKB

int

此為帶正負號的 32 位元整數,可在執行緒執行時用於調整記憶體配置。

64 * 邏輯處理器數目

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

Process \ Concurrency

double

此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。

2.0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

並行是用來初始化執行緒集區,而執行緒集區實作是使用 Windows 的 IO 完成連接埠。如需詳細資料,請參閱<I/O 完成連接埠>。

Process \ GroupAffinity

string

對應至系統上之處理器群組的十六進位值陣列,可用來設定處理執行緒與每個處理器群組中的邏輯處理器之相似性。

您可以使用此屬性建立自訂相似性。此屬性預設是空的。

如需詳細資訊,請參閱<Set GroupAffinity>。

Process \ MaxThreads

int

此為帶正負號的 32 位元整數,指定要包含在執行緒集區中的執行緒數目上限。

0

0 表示伺服器會決定預設值。根據預設,伺服器將此值設定為絕對值 64,或設定為邏輯處理器數目 (以較高者為準)。例如,在啟用超執行緒的 64 核心系統上 (導致 128 個邏輯處理器),執行緒集區最多為 128 個執行緒。

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

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

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

微調執行緒集區設定的詳細資訊可在<Analysis Services 作業指南>中找到。

Process \ MinThreads

int

此為帶正負號的 32 位元整數,指定要預先配置在執行緒集區中的執行緒數目下限。

0

0 表示伺服器會決定預設值。最小值預設為 1。

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

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

微調執行緒集區設定的詳細資訊可在<Analysis Services 作業指南>中找到。

Process \ PriorityRatio

int

此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。

2

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

Process \ StackSizeKB

int

此為帶正負號的 32 位元整數,可在執行緒執行時用於調整記憶體配置。

0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

Query \ Concurrency

double

此為雙精確度浮點數值,決定可以一次佇列之執行緒數目的設定目標演算法。

2.0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

並行是用來初始化執行緒集區,而執行緒集區實作是使用 Windows 的 IO 完成連接埠。如需詳細資料,請參閱<I/O 完成連接埠>。

Query \ GroupAffinity

string

對應至系統上之處理器群組的十六進位值陣列,可用來設定處理執行緒與每個處理器群組中的邏輯處理器之相似性。

您可以使用此屬性建立自訂相似性。此屬性預設是空的。

如需詳細資訊,請參閱<Set GroupAffinity>。

Query \ MaxThreads

int

此為帶正負號的 32 位元整數,指定要包含在執行緒集區中的執行緒數目上限。

0

0 表示伺服器會決定預設值。根據預設,伺服器將此值設定為絕對值 10,或設定為邏輯處理器數目的 2 倍 (以較高者為準)。例如,在具有超執行緒的 4 核心系統上,執行緒數上限為 16。

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

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

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

微調執行緒集區設定的詳細資訊可在<Analysis Services 作業指南>中找到。

Query \ MinThreads

int

此為帶正負號的 32 位元整數,指定要預先配置在執行緒集區中的執行緒數目下限。

0

0 表示伺服器會決定預設值。最小值預設為 1。

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

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

微調執行緒集區設定的詳細資訊可在<Analysis Services 作業指南>中找到。

Query \ PriorityRatio

int

此為帶正負號的 32 位元整數,可用來確保偶爾執行較低優先權的執行緒,即使較高優先權的佇列不是空的。

2

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

Query \ StackSizeKB

int

此為帶正負號的 32 位元整數,可在執行緒執行時用於調整記憶體配置。

0

此為進階屬性,除非在 Microsoft 技術支援的指導之下,否則不應隨意變更。

設定 GroupAffinity 將執行緒相似化到處理器群組中的處理器

GroupAffinity 是為了進階微調而提供。您可以使用 GroupAffinity 屬性設定 Analysis Services 執行緒集區和特定處理器之間的相似性;但是對於大多數安裝,Analysis Services 可以使用所有可用的邏輯處理器時,執行效果最好。因此,群組相似性預設是未指定的。

如果效能測試指出需要 CPU 最佳化,您可以考慮較高層級的方法,例如使用 Windows Server 資源管理員設定邏輯處理器和伺服器處理序之間的相似性。相較於定義個別執行緒集區的自訂相似性,這種方法更易於實作和管理。

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

[!附註]

GroupAffinity 是由限制 Analysis Services 所使用之核心數目的版本所限制。在啟動時,Analysis Services 會使用版本資訊和 GroupAffinity 屬性,來計算 Analysis Services 管理之所有 5 個執行緒集區的相似性遮罩。Standard Edition 最多可以使用 16 個核心。如果您在具有超過 16 個核心的大型多核心系統上安裝 Analysis Services Standard Edition,Analysis Services 只會使用其中 16 個。如果升級舊版的企業執行個體,您最多可以使用 20 個核心。如需有關版本和授權的詳細資訊,請參閱 SQL Server 2012 授權概觀

語法

每個處理器群組的值為十六進位,此十六進位值代表 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 時,請小心檢查您的計算。雖然在整個遮罩無效時 Analysis Services 會傳回錯誤,但是有效和無效設定的組合則會導致 Analysis Services 忽略屬性。例如,如果位元遮罩包含額外值,Analysis Services 會忽略這項設定,而使用系統中的所有處理器。此動作發生時,沒有錯誤或警告提醒您,不過,您可以檢查 msmdsrv.log 檔案,了解相似性的實際設定值。

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

若為多維度 Analysis Service 執行個體,您可以在 IOProcess 執行緒集區上設定 PerNumaNode,進一步最佳化執行緒排程與執行。GroupAffinity 識別哪一組邏輯處理器要用於給定的執行緒集區,而 PerNumaNode 則進一步指定是否要建立多個執行緒集區,進一步相似化到允許之邏輯處理器的子集。

[!附註]

在 Windows Server 2012 上,請使用工作管理員檢視電腦上的 NUMA 節點數目。在工作管理員的 [效能] 索引標籤中,選取 [CPU],然後以滑鼠右鍵按一下圖表區域檢視 NUMA 節點。或者,從 Windows Sysinternals 下載 Coreinfo 公用程式,然後執行 coreinfo –n 傳回 NUMA 節點和每一個節點中的邏輯處理器。

如本主題的Thread Pool Property Reference一節所述,PerNumaNode 的有效值為 -1、0、1、2。

預設值 (建議)

在具有 NUMA 節點的系統上,我們建議您使用 PerNumaNode=-1 預設值,讓 Analysis Services 根據節點計數調整執行緒集區數目和執行緒相似性。在具有 4 個以下節點的系統上,Analysis Services 會實作 PerNumaNode=0 描述的行為,在具有 4 個 (含) 以上節點的系統上則使用 PerNumaNode=1。

選擇值

您也可以覆寫預設值,使用另一個有效值。

設定 PerNumaNode=0

系統會忽略 NUMA 節點。只有一個 IOProcess 執行緒集區,而且該執行緒集區中的所有執行緒都會相似化到所有邏輯處理器。根據預設 (PerNumaNode=-1),如果電腦的 NUMA 節點少於 4 個,這是作用的設定值。

NUMA、處理器和執行緒集區對應

設定 PerNumaNode=1

為每個 NUMA 節點建立 IOProcess 執行緒集區。有個別的執行緒集區會改善本機資源的協調存取,例如 NUMA 節點的本機快取。

NUMA、處理器和執行緒集區對應

設定 PerNumaNode=2

這個設定適用於執行大量 Analysis Services 工作負載的極高階系統。這個屬性在最細微的層級設定 IOProcess 執行緒集區相似性,也就是在邏輯處理器層級建立和相似化個別執行緒集區。

在下列範例中,如果系統有 4 個 NUMA 節點和 32 個邏輯處理器,將 PerNumaNode 設定為 2 會產生 32 個 IOProcess 執行緒集區。第一個 8 執行緒集區中的執行緒會相似化為 NUMA 節點 0 的所有邏輯處理器,但會將理想的處理器設為 0、 1、2,最高到 7。下一個 8 執行緒集區會相似化為 NUMA 節點 1,並將理想的處理器設為 8、9、10,最高到 15,依此類推。

NUMA、處理器和執行緒集區對應

在這個相似性層級,排程器一定會先嘗試使用慣用 NUMA 節點內理想的邏輯處理器。如果此邏輯處理器無法使用,排程器會選擇相同節點內的另一個處理器,如果沒有其他執行緒則選擇相同處理器群組內的處理器。如需詳細資訊和範例,請參閱<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 2008 Analysis Services 效能指南>的 2.2 節。

相依或相關屬性

如<Analysis Services 作業指南>的 2.4 節說明,如果您增加處理執行緒集區,必須先確定 CoordinatorExecutionMode 設定以及 CoordinatorQueryMaxThreads 設定值會使您充分利用增加的執行緒集區大小。

Analysis Services 使用協調者執行緒,收集完成處理或查詢要求所需的資料。協調者會針對必須接觸的每個資料分割,先將一個作業排入佇列。根據資料分割中必須掃描的區段總數,這些作業會繼續將其他作業排入佇列。

CoordinatorExecutionMode 的預設值為 -4,表示每個核心最多 4 個平行作業,限制儲存引擎中 Subcube 要求可平行執行的協調者作業總數。

CoordinatorQueryMaxThreads 的預設值為 16,限制每個資料分割可平行執行的區段作業數目。

判斷目前的執行緒集區設定

每次服務啟動時,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 組態設定 (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

msmdsrv.ini 檔案包含 Analysis Services 執行個體的組態設定,會影響在該執行個體上執行的所有資料庫。您無法使用伺服器組態屬性對其中一個資料庫的效能進行最佳化,而將所有其他資料庫排除在外。不過,您可以安裝多個 Analysis Services 執行個體,並設定每個執行個體使用對共用類似特性或工作負載的資料庫有利的屬性。

所有伺服器組態屬性都包含在 msmdsrv.ini 檔案中。比較可能要修改之屬性的子集也會出現在管理工具,例如 SSMS。

Analysis Services 表格式和多維度執行個體的 msmdsrv.ini 內容是相同的。不過,有些設定只適用於一個模式。基於伺服器模式的行為差異已記載於屬性參考文件。

[!附註]

如需有關如何設定屬性的指示,請參閱<在 Analysis Services 中設定伺服器屬性>。

請參閱

其他資源

關於處理序和執行緒

多個處理器

處理器群組

SQL Server 2012 中的 Analysis Services 執行緒集區變更

Analysis Services 2012 組態設定 (Wordpress 部落格)

支援超過 64 個處理器的系統

SQL Server 2008 R2 Analysis Services 作業指南