affinity mask(服务器配置选项)

适用于:SQL Server

注意

在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 改为使用 ALTER SERVER CONFIGURATION (Transact-SQL)

为了执行多任务, Microsoft Windows 有时会在不同的处理器之间移动进程线程。 虽然从操作系统方面而言,此活动是高效的,但是在高系统负载的情况下,该活动会降低 SQL Server 的性能,因为每个处理器缓存都会不断地重载数据。 如果将各个处理器分配给特定线程,则可以通过消除处理器的重载需要和减少跨处理器的线程迁移(这会减少上下文切换)提高在这些条件下的性能。 线程和处理器之间的这种关联称为“处理器关联”。

SQL Server 通过以下两个关联掩码选项来支持处理器关联:“关联掩码”(也称为 CPU 关联掩码)和“关联 I/O 掩码”。 有关“关联 I/O 掩码”选项的详细信息,请参阅关联输入输出掩码服务器配置选项。 对具有 33 至 64 个处理器的服务器的 CPU 和 I/O 关联支持还要求分别使用 affinity64 mask 服务器配置选项affinity64 I/O mask 服务器配置选项

注意

对具有 33 到 64 个处理器的服务器的关联支持仅在 64 位操作系统上可用。

“关联掩码”选项存在于 SQL Server 的早期版本中,用于动态控制 CPU 关联。

在 SQL Server 中,可以配置“关联掩码”选项而无需重启 SQL Server 实例。 使用 sp_configure 时,必须在设置配置选项之后运行 RECONFIGURE 或 RECONFIGURE WITH OVERRIDE。 使用 SQL Server Express 时,更改“关联掩码”选项不需要重启。

关联掩码的更改是动态进行的,因此可以按需启动和关闭用于在 SQL Server 中绑定进程线程的 CPU 计划程序。 当服务器上的条件改变时会发生这种情况。 例如,如果向服务器上添加了新的 SQL Server 实例,可能需要调整“关联掩码”选项以重新分配处理器负载。

对关联位掩码进行修改需要 SQL Server 启用新的 CPU 计划程序并禁用现有的 CPU 计划程序。 然后就可以在新的或剩余的计划程序上处理新批处理。

若要启动新的 CPU 计划程序,SQL Server 应创建新的计划程序并将其添加到标准计划程序列表中。 新的计划程序仅用于新加入的批处理。 当前批处理会继续在同一计划程序上运行。 当释放了现有工作线程或创建了新的工作线程后,它们就会迁移到新的计划程序。

若要关闭某个计划程序,需要等到该计划程序上的所有批处理都完成其活动并退出之后。 已关闭的计划程序将被标记为脱机,以防在它上面安排新的批处理。

服务器处于运行状态时,无论添加或删除了新的计划程序,锁监视器、检查点、系统任务线程(用于处理 DTC)和信号进程等永久系统任务都会继续在原计划程序上运行。 这些永久系统任务不会动态迁移。 若要在各个计划程序上重新为这些系统任务分配处理器负载,则需要重启 SQL Server 实例。 当 SQL Server 尝试关闭与某个永久系统任务相关联的计划程序时,该任务会继续在脱机计划程序上运行(而不迁移)。 此计划程序将被绑定到修改后的关联掩码中的处理器,在修改之前,不会在其绑定的处理器上添加任何负载。 额外的脱机计划程序不会显著影响系统的负载。 如果是这样,则需要重新启动数据库服务器,以便在使用修改后的关联掩码的计划程序上重新配置这些任务。

请勿将 SQL Server 的“关联掩码”和“关联 I/O 掩码”配置值设置为使用相同的 CPU。 如果选择针对 SQL Server 工作线程计划和 I/O 处理绑定处理器,则性能可能会受到影响。 因此,请确保没有针对同一处理器设置配置值。 同样的建议也适用于“affinity64 掩码”和“affinity64 I/O 掩码”。 为了确保关联掩码不会与关联 IO 掩码重叠,RECONFIGURE 命令将验证正常 CPU 与 I/O 关联是否互相排斥。 否则,将向客户端会话和 SQL Server 错误日志报告一条错误消息,指明不建议进行这种设置。

 Msg 5834, Level 16, State 1, Line 1
 The affinity mask specified conflicts with the IO affinity mask specified. Use the override option to force this configuration

运行“RECONFIGURE WITH OVERRIDE”选项将允许 CPU 和 I/O 关联重叠,而不互相排斥。

I/O 关联任务(如惰性编写器和日志编写器)直接受 I/O 关联掩码的影响。 如果惰性编写器和日志编写器任务未绑定,它们将与其他永久任务(如锁监视器或检查点)遵循相同的规则。 如果指定的关联掩码试图映射到不存在的 CPU,RECONFIGURE 命令会向客户端会话和 SQL Server 错误日志报告一条错误消息。 在这种情况下,RECONFIGURE WITH OVERRIDE 选项将不起作用,并将再次报告相同的配置错误。

你也可以从 Windows 操作系统分配的特定工作负载中排除 SQL Server 活动。 如果将代表某个处理器的位设置为 1,SQL Server 数据库引擎将会选择该处理器来进行线程分配。 如果将“关联掩码”设置为 0(默认值),则 Microsoft Windows 计划算法会设置线程的关联。 如果将“关联掩码”设置为任一非零值,则 SQL Server 关联会将该值解释为指定可供选择的处理器的位掩码。

通过防止 SQL Server 线程在某个特定的处理器上运行,Microsoft Windows 可以更好地评估 Windows 专用的系统进程处理。 例如,在运行两个 SQL Server 实例(实例 A 和实例 B)的具有 8 个 CPU 的服务器上,系统管理员可以使用关联掩码选项将第一组的 4 个 CPU 分配给实例 A,将第二组的 4 个 CPU 分配给实例 B。若要配置 32 个以上的处理器,应同时设置关联掩码和 affinity64 掩码。 关联掩码 值如下所示:

  • 在多处理器计算机中,单字节 关联掩码 最多可以涵盖 8 个 CPU。

  • 在多处理器计算机中,双字节 关联掩码 最多可以涵盖 16 个 CPU。

  • 在多处理器计算机中,3 字节 关联掩码 最多可以涵盖 24 个 CPU。

  • 在多处理器计算机中,4 字节 关联掩码 最多可以涵盖 32 个 CPU。

  • 若要涵盖 32 个以上的 CPU,可为前 32 个 CPU 配置一个 4 字节关联掩码,为其余的 CPU 配置一个最多 4 字节的 affinity64 掩码。

因为设置 SQL Server 处理器关联是一种专用操作,所以建议只在需要时使用。 大多数情况下,Microsoft Windows 的默认关联可提供最佳性能。 在设置关联掩码时考虑其他应用程序对 CPU 的需求。 有关详细信息,请参阅 Windows 操作系统文档。

注意

可以使用 Windows 系统监视器来查看和分析单个处理器的使用情况。

指定“关联 I/O 掩码”选项后,必须将其与“关联掩码配置”选项一起使用。 但是,如前文所述,请勿在“关联掩码”开关和“关联 I/O 掩码”选项中启用相同的 CPU。 与每个 CPU 对应的位应处于以下三种状态之一:

  • 在 affinity mask 选项和 affinity I/O mask 选项中均为 0。

  • 在 affinity mask 选项中为 1,在 affinity I/O mask 选项中为 0。

  • 在 affinity mask 选项中为 0,在 affinity I/O mask 选项中为 1。

注意

请不要在 Windows 操作系统中配置 CPU 关联后,还在 SQL Server 中配置关联掩码。 这些设置实现的效果相同,如果配置不一致,则可能会得到意外的结果。 最好使用 SQL Server 中的“sp_configure”选项配置 SQL Server CPU 关联。

示例

例如,设置“关联掩码”选项时,如果选择处理器 1、2 和 5 作为可用的处理器,并将位的位置 1、2 和 5 设置为 1,位 0、3、4、6 和 7 设置为 0,则必须使用十六进制值 0x26 或等于 38 的十进制值。 从右至左对位位置进行编号…

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'affinity mask', 38;
RECONFIGURE;
GO

以下是具有 8 个 CPU 的系统的 关联掩码 值。

十进制值 二进制位掩码 允许 SQL Server 线程在哪些处理器上运行
1 00000001 0
3 00000011 0 和 1
7 00000111 0、1 和 2
15 00001111 0、1、2 和 3
31 00011111 0、1、2、3 和 4
63 00111111 0、1、2、3、4 和 5
127 01111111 0、1、2、3、4、5 和 6
255 11111111 0、1、2、3、4、5、6 和 7

affinity mask 选项是一个高级选项。 如果使用 sp_configure 系统存储过程来更改该设置,则仅当“显示高级选项”设置为 1 时,才可以更改“关联掩码” 。 执行 Transact-SQL RECONFIGURE 命令后,新的设置将立即生效,且不需要重启 SQL Server 实例。

非一致性内存访问 (NUMA)

当使用基于硬件的非一致性内存访问 (NUMA) 并设置了关联掩码时,节点中的每个计划程序都将绑定到其自己的 CPU。 未设置关联掩码时,每个计划程序都绑定到 NUMA 节点内的 CPU 组,映射到 NUMA 节点 N1 的计划程序可对节点中的任何 CPU 计划工作,但是不能对与其他节点关联的 CPU 计划工作。

针对单个 NUMA 节点执行的任何操作都只能使用该节点中的缓冲区页。 当针对多个节点上的 CPU 以并行方式执行操作时,可以使用所涉及的任何节点中的内存。

许可问题

动态关联受 CPU 许可的严格约束。 SQL Server 不允许对“关联掩码”选项进行任何违反许可策略的配置。

启动

如果在 SQL Server 启动期间或在数据库附加期间,指定的关联掩码违反了许可策略,则引擎层会完成启动进程或数据库附加/还原操作,然后将关联掩码的 sp_configure 运行值重置为零,并向 SQL Server 错误日志发出一条错误消息。

重新配置

如果在运行 Transact-SQL RECONFIGURE 命令时,指定的关联掩码违反了许可策略,则系统将向客户端会话和 SQL Server 错误日志报告错误消息,要求数据库管理员重新配置关联掩码。 在这种情况下,不接受任何 RECONFIGURE WITH OVERRIDE 命令。

后续步骤