线程池属性

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 是用于无法容纳在单个网络消息内的所有其他请求的分析池。

    注意注意

    任一分析池中的线程都可用于执行查询。快速执行的查询(如快速发现或取消请求)有时会立即执行,而不是排队进入查询线程池。

  • Query 是执行并非由分析线程池处理的所有请求的线程池。此线程池中的线程将执行所有类型的操作,例如发现、MDX、DMX、DAX 和 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 线程池策略。在 NUMA 节点数少于 4 个的系统上,服务器行为与值为 0 时的行为相同(为系统创建一个 IOProcess 线程池)。在具有 4 个或更多节点的系统上,行为与值为 1 时的行为相同(为每个节点创建 IOProcess 线程池)。

0 = 按 NUMA 节点线程池禁用,以便 msmdsrv.exe 进程只使用一个 IOProcess 线程池。

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,或逻辑处理器数的两倍,取两者中的较大值。

如果将此值设置为负值,服务器会将此值乘以逻辑处理器数。例如,当在具有 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,或逻辑处理器数的两倍,取两者中的较大值。

如果将此值设置为负值,服务器会将此值乘以逻辑处理器数。例如,当在具有 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,或逻辑处理器数的两倍,取两者中的较大值。例如,在采用超线程的 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 版本可使用最多 16 个内核。如果您在具有超过 16 个内核的大型多核系统上安装 Analysis Services Standard Edition,则 Analysis Services 将仅使用其中的 16 个内核。如果您升级之前版本的 Enterprise 实例,则最多可以使用 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 服务器中最多可有 10 个处理器组。

  3. 计算要使用的处理器组的位掩码

    7654 3210

    将数字替换为 0 或 1,具体取决于您要排除还是包括逻辑处理器。在具有八个处理器的系统上,如果您要将处理器 7、6、5、4 和 1 用于 Analysis Services,则计算方式可能如下所示:

    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 Services 实例,您可以在 IOProcess 线程池上设置 PerNumaNode 以进一步优化线程安排和执行。尽管 GroupAffinity 标识哪组逻辑处理器用于给定线程池,但 PerNumaNode 则更加精确,它通过指定是否创建多个线程池,来进一步关联到允许的逻辑处理器的某一部分。

注意注意

在 Windows Server 2012 上,使用任务管理器查看计算机上的 NUMA 节点数。在任务管理器中的“性能”选项卡上,选择“CPU”,然后右键单击图形区以查看 NUMA 节点。或者,从 Windows Sysinternals 下载 Coreinfo 实用工具并运行 coreinfo –n 以返回 NUMA 节点和每个节点中的逻辑处理器。

PerNumaNode 的有效值为 -1、0、1、2,如本主题中 Thread Pool Property Reference 一节所述。

默认值(建议)

在具有 NUMA 节点的系统上,建议使用默认设置 PerNumaNode=-1,允许 Analysis Services 基于节点计数调整线程池数及其线程关联。如果系统的节点数不超过 4 个,则 Analysis Services 实现 PerNumaNode=0 所描述的行为,而 PerNumaNode=1 用在节点数不少于 4 个的系统上。

选择值

还可以覆盖默认值以使用其他有效值。

设置 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 个作业,这样可约束存储引擎中的子多维数据集请求可并行执行的协调器作业总数。

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)"

请记住,用于设置 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 操作指南