Analysis Services 會針對許多作業使用多線程處理,藉由平行執行多個作業來改善整體伺服器效能。 為了更有效率地管理線程,Analysis Services 會使用線程集區預先配置線程,並加速下一個作業的線程可用性。
Analysis Services 的每個實例都會維護自己的一組線程集區。 表格式和多維度實例使用線程集區的方式有顯著差異。 最重要的差異在於只有多維度解決方案會使用 IOProcess 線程集區。 因此, PerNumaNode 本主題中所述的屬性對表格式實例來說並不有意義。
本主題包含下列幾節:
備註
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 工作負載的五個線程集區中的任何一個上設定自定義親和性:
解析池 \ 短請求 是用於短請求的解析池。 符合單一網路訊息的要求會被視為簡短。
剖析 \ Long 是一個解析池,處理不適用於單一網路訊息的所有其他請求。
備註
來自任一剖析集區的線程可用來執行查詢。 執行快速查詢,例如快速搜尋或取消要求,有時會立即執行,而不是排入查詢執行緒池。
Query是線程集區,負責執行解析線程集區未處理的所有請求。 此線程集區中的線程會執行所有類型的作業,例如 Discovers、MDX、DAX、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 |
雙倍 | 決定演算法的雙精度浮點值,用於設定可一次排入佇列的線程數目目標。 | 2.0 | 除非在 Microsoft 支援的指導下,否則您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 如需詳細資訊,請參閱 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 節點線程集區,讓 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 \ Concurrency |
雙倍 | 一個雙精度浮點值,用於決定設定演算法,以確定可以同時排入佇列的線程數目目標。 | 2.0 | 除非在 Microsoft 支援的指導下,否則您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 如需詳細資訊,請參閱 I/O 完成埠 。 |
解析 \ 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 支援的指導下,否則您不應該變更的進階屬性。 |
解析 \ Short \ Concurrency |
雙倍 | 雙精度浮點數用於演算法設定一次可排入佇列之執行緒數目的目標。 | 2.0 | 除非在 Microsoft 支援的指導下,否則您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 如需詳細資訊,請參閱 I/O 完成埠。 |
解析 \ Short \ GroupAffinity |
字符串 | 對應系統中處理器群組的十六進位值陣列,用來設定解析執行緒與每個處理器群組中邏輯處理器的親和性。 | 沒有 | 您可以使用這個屬性來建立自定義親和性。 屬性預設為空白。 如需詳細資訊 ,請參閱設定 GroupAffinity 將線程親和化為處理器群組中的處理器 。 |
解析 \ Short \ 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 支援的指導下,否則您不應該變更的進階屬性。 |
解析 \ Short \ StackSizeKB |
整數 (int) | 帶正負號的32位整數,可用來在線程執行期間調整記憶體配置。 | 64 * 邏輯處理器 | 除非在 Microsoft 支援的指導下,否則您不應該變更的進階屬性。 |
Process \ Concurrency |
雙倍 | 雙精確度浮點值,決定在一次可排入佇列之線程數目上設定目標的演算法。 | 2.0 | 除非在 Microsoft 支援的指導下,否則您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 如需詳細資訊,請參閱 I/O 完成埠。 |
Process \ GroupAffinity |
字符串 | 對應至系統上處理器群組的十六進位值陣列,用來將處理線程的親和性設定為每個處理器群組中的邏輯處理器。 | 沒有 | 您可以使用這個屬性來建立自定義親和性。 屬性預設為空白。 如需詳細資訊 ,請參閱設定 GroupAffinity 將線程親和化為處理器群組中的處理器 。 |
Process \ MaxThreads |
整數 (int) | 帶正負號的 32 位整數,指定要包含在線程集區中的線程數目上限。 | 0 | 0 表示伺服器會決定預設值。 根據預設,伺服器會將此值設定為 64 的絕對值,或邏輯處理器的數目,以較高者為準。 例如,在啟用超線程的 64 核心系統上,線程集區上限為 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 |
雙倍 | 使用雙精度浮點值來決定設定目標線程數目時所使用的演算法,即一次可以排隊的線程數目。 | 2.0 | 除非在 Microsoft 支援的指導下,否則您不應該變更的進階屬性。 並行是用來初始化線程集區,這些集區是使用 Windows 中的 IO 完成埠實作。 如需詳細資訊,請參閱 I/O 完成埠。 |
Query \ GroupAffinity |
字符串 | 對應至系統上處理器群組的十六進位值陣列,用來將處理線程的親和性設定為每個處理器群組中的邏輯處理器。 | 沒有 | 您可以使用這個屬性來建立自定義親和性。 屬性預設為空白。 如需詳細資訊 ,請參閱設定 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 Resource Manager 來設定邏輯處理器與伺服器進程之間的親和性。 相較於為個別線程集區定義自定義親和性,這種方法可以比定義自定義親和性更容易實作和管理。
如果該方法不足,您可以定義線程集區的自定義親和性,以達到更高的精確度。 由於在大型多核心系統(無論是 NUMA 還是非 NUMA)上,線程集區分佈在過於廣泛的處理器範圍內導致性能下降,更可能建議自定義親和性設定。 雖然您可以在少於 64 個邏輯處理器的系統上設定 GroupAffinity ,但優點是微不足道的,甚至可能會降低效能。
備註
GroupAffinity 受限於限制 Analysis Services 所使用核心數目的版本。 在啟動時,Analysis Services 會使用版本資訊和 GroupAffinity 屬性來計算 Analysis Services 所管理之 5 個線程集區的親和性遮罩。 Standard Edition 最多可以使用 16 個核心。 如果您在擁有 16 個以上核心的大型多核心系統上安裝 Analysis Services 標準版本,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>
計算處理器親和性遮罩的步驟
您可以在 SQL Server Management Studio 的 msmdsrv.ini 或伺服器屬性頁中設定 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時,請仔細檢查您的計算。 雖然如果整個遮罩無效,Analysis Services 會傳回錯誤,但有效和無效的設定組合會導致 Analysis Services 忽略 屬性。 例如,如果位掩碼包含額外的值,Analysis Services 會使用系統上的所有處理器來忽略設定。 此動作發生時不會發出任何錯誤或警告,但您可以檢查msmdsrv.log檔案,以了解親和性的實際設定方式。
將 PerNumaNode 設定為使 IO 執行緒與 NUMA 節點中的處理器關聯
針對多維度 Analysis Services 實例,您可以在 IOProcess 線程集區 上設定 PerNumaNode,以進一步優化線程排程和執行。 雖然GroupAffinity識別要使用哪一組邏輯處理器用於特定的線程集區,PerNumaNode則更進一步,指定是否建立多個線程集區,並進一步將其綁定到允許使用的邏輯處理器的某些子集。
備註
在 Windows Server 2012 上,使用任務管理員來檢視電腦上的 NUMA 節點數目。 在 [任務管理器] 的 [效能] 索引標籤上,選取 [CPU ],然後以滑鼠右鍵按兩下圖形區域以檢視 NUMA 節點。 或者,從 Windows Sysinternals 下載 Coreinfo 公用程式,然後執行 coreinfo -n 以傳回每個節點中的 NUMA 節點和邏輯處理器。
的有效值為 PerNumaNode -1、0、1、2,如本主題的 線程集區屬性參考 一節所述。
預設值 (建議)
在具有 NUMA 節點的系統上,我們建議使用 PerNumaNode=-1 的預設設定,讓 Analysis Services 根據節點計數調整線程集區數目及其線程親和性。 如果系統少於 4 個節點,Analysis Services 會實作 =0 所 PerNumaNode描述的行為,而 PerNumaNode=1 則用於具有 4 個以上節點的系統上。
選擇值
您也可以覆蓋預設值,以使用另一個有效值。
設定 PerNumaNode=0
會忽略 NUMA 節點。 只有一個IOProcess線程集區,而且該線程集區中的所有線程都會與所有邏輯處理器親和化。 在預設情況下(其中 PerNumaNode=-1),如果電腦少於 4 個 NUMA 節點,則這是有效設定。
設定 PerNumaNode=1
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節點內使用理想的邏輯處理器。 如果邏輯處理器無法使用,排程器會在相同的節點內選擇另一個處理器,如果沒有其他線程可用,則選擇在同一個處理器群組內。 如需詳細資訊和範例,請參閱 Analysis Services 2012 組態設定 (Wordpress 部落格) 。
IOProcess 線程之間的工作分佈
當您考慮是否設定 PerNumaNode 屬性時,知道使用線程的方式 IOProcess 可協助您做出更明智的決策。
回想一下, IOProcess 用於多維度引擎中與儲存引擎查詢相關聯的IO作業。
掃描區段時,引擎會識別區段所屬的數據分割,並嘗試將區段作業排入數據分割所使用的線程集區。 一般而言,屬於分割區的所有區段都會將其工作排入相同的線程集區。 在 NUMA 系統上,此行為特別有利,因為針對所有分區的掃描都會使用本地配置給該 NUMA 節點的文件系統快取中的記憶體。
下列案例建議調整,有時可改善 NUMA 系統上的查詢效能:
對於數據分割不足的量值群組(例如,具有單一分割區),請增加分割區數目。 只要使用一個分割區,引擎就會一律將工作佇列到一個執行緒池(執行緒池 0)。 新增更多分割區可讓引擎使用其他線程集區。
或者,如果您無法建立其他分割區,請嘗試將 =0 設定
PerNumaNode為增加線程集區 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 核心系統上查詢線程集區的預設設定 (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
msmdsrv.ini 檔案包含 Analysis Services 實例的組態設定,會影響該實例上執行的所有資料庫。 您無法使用伺服器組態屬性,將一個資料庫的效能優化,以排除所有其他資料庫。 不過,您可以安裝多個 Analysis Services 實例,並將每個實例設定為使用有利於共享類似特性或工作負載之資料庫的屬性。
所有伺服器組態屬性都會包含在 msmdsrv.ini 檔案中。 更可能修改的屬性子集也會出現在管理工具中,例如 SSMS。
msmdsrv.ini 的內容與 Analysis Services 的表格式和多維度實例相同。 不過,某些設定僅適用於一個模式。 屬性參考檔中會指出以伺服器模式為基礎的行為差異。
備註
如需如何設定屬性的指示,請參閱 在 Analysis Services 中設定伺服器屬性。
另請參閱
關於進程和線程多個處理器處理器群組SQL Server 2012 中的 Analysis Services 線程集區變更Analysis Services 2012 組態設定(Wordpress 部落格)支援超過 64 個處理器的系統SQL Server 2008 R2 Analysis Services 作業指南