线程池属性

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 工作负载的五个线程池中的任何一个上设置自定义相关性:

  • 分析 \ Short 是用于短请求的分析池。 可容纳在单个网络消息内的请求被视为简短请求。

  • 分析 \ Long 是一个分析池,用于不适用于单个网络消息的所有其他请求。

    注意

    来自两种解析池的线程都可以用来执行查询。 诸如快速发现或取消请求等快速执行的查询有时会立即执行,而不是排队进入查询线程池。

  • Query 是执行分析线程池未处理的所有请求的线程池。 此线程池中的线程将执行所有类型的操作,如发现、MDX、DAX、DMX 和 DDL 命令。

  • IOProcess 用于与多维引擎中的存储引擎查询关联的 IO 作业。 这些线程所做的工作应该不依赖于其他线程。 这些线程通常将扫描单个分区段,并对段数据执行筛选和聚合操作。 IOProcess 线程对 NUMA 硬件配置特别敏感。 因此,此线程池具有配置属性, PerNumaNode 可用于根据需要优化性能。

  • Process 适用于持续时间较长的存储引擎作业,包括聚合、索引和提交操作。 ROLAP 存储模式还使用“处理”线程池中的线程。

注意

虽然Msmdsrv.ini部分VertiPaq具有线程池设置,\GroupAffinityThreadPoolVertiPaq\但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 字符串 一个十六进制值的数组,这些值与系统上的处理器组相对应,用于设置 IOProcess 线程池中的线程与每个处理器组中的逻辑处理器的关联。 可以使用此属性创建自定义关联。 该属性默认为空。

有关详细信息,请参阅 设置 GroupAffinity 以便将线程关联到处理器组中的处理器

仅适用于多维模型。
IOProcess \ MaxThreads int 有符号 32 位整数,用于指定线程池中要包含的最大线程数。 0 0 指示由服务器确定默认值。 默认情况下,服务器将此值设置为 64 或设置为逻辑处理器数的 10 倍,以较大者为准。 例如,在采用超线程的 4 核系统上,线程池最大值是 80 个线程。

如果将此值设置为负值,则服务器将该值乘以逻辑处理器数。 例如,当在具有 32 个逻辑处理器的服务器上设置为 -10 时,最大值是 320 个线程。

最大值取决于按以前定义的任何自定义关联掩码可用的处理器数。 例如,如果您已将线程池关联设置为使用 32 个处理器中的 8 个,并且现在将 MaxThreads 设置为 -10,则线程池的上限将为 10 乘以 8(即 80 个线程)。

服务启动时,此线程池属性所使用的实际值即会写入 msmdsrv log 文件。

可在 Analysis Services 操作指南中找到有关优化线程池设置的详细信息。

仅适用于多维模型。
IOProcess \ MinThreads int 一种 32 位有符号整数,用于指定为线程池预分配的最小线程数。 0 0 指示由服务器确定默认值。 默认情况下,最小值为 1。

如果将此值设置为负值,则服务器将该值乘以逻辑处理器数。

服务启动时,此线程池属性所使用的实际值即会写入 msmdsrv log 文件。

可在 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 节点关联,且理想处理器设置为逻辑处理器。

有关详细信息,请参阅 设置 PerNumaNode 以使 IO 线程与 NUMA 节点中的处理器关联

仅适用于多维模型。
IOProcess \ PriorityRatio int 有符号 32 位整数,可用于确保即使高优先级队列不为空,有时也能执行低优先级线程。 2 这是一项高级属性,除非有 Microsoft 技术支持的指导,否则不应更改此属性。

仅适用于多维模型。
IOProcess \ StackSizeKB int 一种 32 位有符号整数,可用于调整线程执行期间的内存分配。 0 这是一项高级属性,除非有 Microsoft 技术支持的指导,否则不应更改此属性。

仅适用于多维模型。
解析 \ Long \ Concurrency Double 一个双精度浮点值,确定用于设置可同时排队的线程数目标的算法。 2.0 这是一项高级属性,除非有 Microsoft 技术支持的指导,否则不应更改此属性。

并发用于初始化线程池,这些线程池使用 Windows 中的 IO 完成端口来实施。 有关详细信息,请参阅 I/O 完成端口
解析 \ Long \ GroupAffinity 字符串 一个十六进制值的数组,这些值与系统上的处理器组相对应,用于设置分析线程与每个处理器组中的逻辑处理器的关联。 可以使用此属性创建自定义关联。 该属性默认为空。

有关详细信息,请参阅 设置 GroupAffinity 以便将线程关联到处理器组中的处理器
解析 \ Long \ NumThreads int 有符号 32 位整数属性,用于定义可为长命令创建的线程数。 0 0 指示由服务器确定默认值。 默认行为是将 NumThreads 设置为绝对值 4,或逻辑处理器数的两倍,取两者中的较大值。

如果将此值设置为负值,则服务器将该值乘以逻辑处理器数。 例如,当在具有 32 个逻辑处理器的服务器上设置为 -10 时,最大值是 320 个线程。

最大值取决于按以前定义的任何自定义关联掩码可用的处理器数。 例如,如果已将线程池关联设置为使用 32 个处理器中的 8 个,并且现在将 NumThreads 设置为 -10,则线程池的上限将为 10 乘以 8,即 80 个线程。

服务启动时,此线程池属性所使用的实际值即会写入 msmdsrv log 文件。
解析 \ Long \ PriorityRatio int 有符号 32 位整数,可用于确保即使高优先级队列不为空,有时也能执行低优先级线程。 0 这是一项高级属性,除非有 Microsoft 技术支持的指导,否则不应更改此属性。
解析 \ Long \ StackSizeKB int 一种 32 位有符号整数,可用于调整线程执行期间的内存分配。 0 这是一项高级属性,除非有 Microsoft 技术支持的指导,否则不应更改此属性。
解析 \ Short \ Concurrency Double 一个双精度浮点值,确定用于设置可同时排队的线程数目标的算法。 2.0 这是一项高级属性,除非有 Microsoft 技术支持的指导,否则不应更改此属性。

并发用于初始化线程池,这些线程池使用 Windows 中的 IO 完成端口来实施。 有关详细信息,请参阅 I/O 完成端口
解析 \ Short \ GroupAffinity 字符串 一个十六进制值的数组,这些值与系统上的处理器组相对应,用于设置分析线程与每个处理器组中的逻辑处理器的关联。 可以使用此属性创建自定义关联。 该属性默认为空。

有关详细信息,请参阅 设置 GroupAffinity 以便将线程关联到处理器组中的处理器
解析 \ Short \ NumThreads int 有符号 32 位整数属性,用于定义可为短命令创建的线程数。 0 0 指示由服务器确定默认值。 默认行为是将 NumThreads 设置为绝对值 4,或逻辑处理器数的两倍,取两者中的较大值。

如果将此值设置为负值,则服务器将该值乘以逻辑处理器数。 例如,当在具有 32 个逻辑处理器的服务器上设置为 -10 时,最大值是 320 个线程。

最大值取决于按以前定义的任何自定义关联掩码可用的处理器数。 例如,如果已将线程池关联设置为使用 32 个处理器中的 8 个,并且现在将 NumThreads 设置为 -10,则线程池的上限将为 10 乘以 8,即 80 个线程。

服务启动时,此线程池属性所使用的实际值即会写入 msmdsrv log 文件。
解析 \ Short \ PriorityRatio int 有符号 32 位整数,可用于确保即使高优先级队列不为空,有时也能执行低优先级线程。 0 这是一项高级属性,除非有 Microsoft 技术支持的指导,否则不应更改此属性。
解析 \ Short \ StackSizeKB int 一种 32 位有符号整数,可用于调整线程执行期间的内存分配。 64 * 逻辑处理器数 这是一项高级属性,除非有 Microsoft 技术支持的指导,否则不应更改此属性。
Process \ Concurrency Double 一个双精度浮点值,确定用于设置可同时排队的线程数目标的算法。 2.0 这是一项高级属性,除非有 Microsoft 技术支持的指导,否则不应更改此属性。

并发用于初始化线程池,这些线程池使用 Windows 中的 IO 完成端口来实施。 有关详细信息,请参阅 I/O 完成端口
Process \ GroupAffinity 字符串 一个十六进制值的数组,这些值与系统上的处理器组相对应,用于设置处理线程与每个处理器组中的逻辑处理器的关联。 可以使用此属性创建自定义关联。 该属性默认为空。

有关详细信息,请参阅 设置 GroupAffinity 以便将线程关联到处理器组中的处理器
Process \ MaxThreads int 有符号 32 位整数,用于指定线程池中要包含的最大线程数。 0 0 指示由服务器确定默认值。 默认情况下,服务器将此值设置为绝对值 64,或逻辑处理器数,取两者中的较大值。 例如,在启用超线程的 64 核系统上(一共 128 个逻辑处理器),线程池最大值是 128 个线程。

如果将此值设置为负值,则服务器将该值乘以逻辑处理器数。 例如,当在具有 32 个逻辑处理器的服务器上设置为 -10 时,最大值是 320 个线程。

最大值取决于按以前定义的任何自定义关联掩码可用的处理器数。 例如,如果您已将线程池关联设置为使用 32 个处理器中的 8 个,并且现在将 MaxThreads 设置为 -10,则线程池的上限将为 10 乘以 8(即 80 个线程)。

服务启动时,此线程池属性所使用的实际值即会写入 msmdsrv log 文件。

可在 Analysis Services 操作指南中找到有关优化线程池设置的详细信息。
Process \ MinThreads int 一种 32 位有符号整数,用于指定为线程池预分配的最小线程数。 0 0 指示由服务器确定默认值。 默认情况下,最小值为 1。

如果将此值设置为负值,则服务器将该值乘以逻辑处理器数。

服务启动时,此线程池属性所使用的实际值即会写入 msmdsrv log 文件。

可在 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 字符串 一个十六进制值的数组,这些值与系统上的处理器组相对应,用于设置处理线程与每个处理器组中的逻辑处理器的关联。 可以使用此属性创建自定义关联。 该属性默认为空。

有关详细信息,请参阅 设置 GroupAffinity 以便将线程关联到处理器组中的处理器
Query \ MaxThreads int 有符号 32 位整数,用于指定线程池中要包含的最大线程数。 0 0 指示由服务器确定默认值。 默认情况下,服务器将此值设置为绝对值 10 或逻辑处理器数的 2 倍,以较大者为准。 例如,在 4 核超线程系统上,最大线程数 16。

如果将此值设置为负值,则服务器将该值乘以逻辑处理器数。 例如,当在具有 32 个逻辑处理器的服务器上设置为 -10 时,最大值是 320 个线程。

最大值取决于按以前定义的任何自定义关联掩码可用的处理器数。 例如,如果您已将线程池关联设置为使用 32 个处理器中的 8 个,并且现在将 MaxThreads 设置为 -10,则线程池的上限将为 10 乘以 8(即 80 个线程)。

服务启动时,此线程池属性所使用的实际值即会写入 msmdsrv log 文件。

可在 Analysis Services 操作指南中找到有关优化线程池设置的详细信息。
Query \ MinThreads int 一种 32 位有符号整数,用于指定为线程池预分配的最小线程数。 0 0 指示由服务器确定默认值。 默认情况下,最小值为 1。

如果将此值设置为负值,则服务器将该值乘以逻辑处理器数。

服务启动时,此线程池属性所使用的实际值即会写入 msmdsrv log 文件。

可在 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 版本可使用最多 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 ,从“逻辑处理器到组映射”部分获取此信息。 为每个逻辑处理器生成单独一行。

  2. 按从右到左顺序排列处理器: 7654 3210

    本例仅显示 8 个处理器(0 到 7),但一个处理器组最多可有 64 个逻辑处理器,而企业级 Windows 服务器中最多可有 10 个处理器组。

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

    7654 3210

    使用 0 或 1 替换数字,具体取决于要排除还是包括逻辑处理器。 在具有 8 个处理器的系统上,如果要将处理器 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 ,以进一步优化线程计划和执行。 标识要用于给定线程池的逻辑处理器集,PerNumaNode通过GroupAffinity指定是否创建多个线程池(进一步关联到允许的逻辑处理器的某些子集)来更进一步。

注意

在 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),如果计算机具有的 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)。 添加更多分区使该引擎可以使用其他线程池。

    或者,如果无法创建其他分区,请尝试将 =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 个,这限制了存储引擎中的子多维数据集请求可并行执行的协调器作业总数。

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的内容相同。 但是,有些设置仅适用于一种模式。 基于服务器模式的行为差异记录在属性参考文档中。

注意

有关如何设置属性的说明,请参阅 Configure Server Properties in Analysis Services

另请参阅

关于进程和线程多处理器Analysis Services 线程池SQL Server 2012Analysis Services 2012 配置设置 (Wordpress 博客) 具有 64 个以上处理器的支持系统SQL Server 2008 R2 Analysis Services 操作指南