Compartir a través de


affinity mask (opción)

Nota

Esta característica se quitará en una versión futura de Microsoft SQL Server. No utilice esta característica en nuevos trabajos de desarrollo y modifique lo antes posible las aplicaciones que actualmente la utilizan.

Para llevar a cabo una multitarea, Microsoft Windows 2000 y Windows Server 2003 a veces mueven subprocesos entre distintos procesadores. Aunque esta actividad es eficaz desde el punto de vista del sistema operativo, puede reducir el rendimiento de SQL Server cuando la carga del sistema es grande, ya que la memoria caché de cada procesador se carga repetidamente con datos. La asignación de procesadores a subprocesos específicos puede mejorar el rendimiento en estas condiciones al eliminar las operaciones de repetición de carga del procesador y reducir la migración de subprocesos entre procesadores (con lo que se reduce el cambio de contexto); dicha asociación entre un subproceso y un procesador se denomina afinidad del procesador.

SQL Server admite la afinidad del procesador por medio de dos opciones de máscara de afinidad: affinity mask (también conocida como CPU affinity mask) y affinity I/O mask. Para obtener más información acerca de la opción affinity I/O mask, vea affinity I/O mask (opción). La compatibilidad de la afinidad de CPU y de E/S con servidores que tienen entre 33 y 64 procesadores requiere el uso adicional de affinity64 mask (opción) y affinity64 I/O mask (opción), respectivamente.

Nota

La compatibilidad de la afinidad con servidores que tienen entre 33 y 64 procesadores solamente está disponible en sistemas operativos de 64 bits.

La opción affinity mask, que existía en versiones anteriores de SQL Server, controla la afinidad de la CPU de forma dinámica.

En SQL Server, la opción affinity mask se puede configurar sin necesidad de reiniciar la instancia de SQL Server. Si usa sp_configure, debe ejecutar RECONFIGURE o RECONFIGURE WITH OVERRIDE después de establecer una opción de configuración. Cuando se utiliza SQL Server Express, es necesario reiniciar después de modificar la opción affinity mask.

Los cambios en las máscaras de afinidad se producen de forma dinámica, lo que permite el inicio y cierre a petición de los programadores de CPU que enlazan los subprocesos en SQL Server. Esto puede ocurrir cuando cambien las condiciones del servidor. Por ejemplo, si se agrega al servidor una nueva instancia de SQL Server, puede ser necesario realizar ajustes en la opción affinity mask para redistribuir la carga del procesador.

Las modificaciones de las máscaras de bits de afinidad requieren que SQL Server habilite un nuevo programador de CPU y deshabilite el programador de CPU existente. A continuación se pueden procesar otros lotes en los programadores nuevos o restantes.

Para iniciar un nuevo programador de CPU, SQL Server crea un nuevo programador y lo agrega a la lista de programadores estándar. El nuevo programador sólo se tiene en cuenta para los nuevos procesos por lotes entrantes. Los procesos por lotes actuales continúan ejecutándose en el mismo programador. Los subprocesos de trabajo migran al nuevo programador cuando se liberan o cuando se crean nuevos subprocesos de trabajo.

Para cerrar un programador, es necesario que todos los procesos por lotes del programador finalicen sus actividades y se cierren. Los programadores que se han cerrado se marcan como sin conexión para que no se programe ningún proceso por lotes nuevo en ellos.

Tanto si se agrega un nuevo programador como si se quita, las tareas permanentes del sistema, como lockmonitor, checkpoint, subproceso de tarea del sistema (DTC en procesamiento) y el proceso de señal, continúan ejecutándose en el programador mientras el servidor esté operativo. Estas tareas permanentes del sistema no se migran de forma dinámica. Para redistribuir la carga del procesador para estas tareas del sistema entre los programadores, es necesario reiniciar la instancia de SQL Server. Si SQL Server intenta cerrar un programador asociado con una tarea permanente del sistema, ésta continúa ejecutándose en el programador sin conexión (sin migración). Este programador está enlazado a los procesadores de la máscara de afinidad modificada y no debe imponer ninguna carga en el procesador con el que se estableció la afinidad antes del cambio. La existencia de programadores sin conexión adicionales no debería afectar significativamente a la carga del sistema. En caso contrario, es necesario reiniciar el servidor de base de datos para volver a configurar las tareas.

La máscara de afinidad de E/S afecta directamente a las tareas de afinidad de E/S (como lazywriter y logwriter). Si no se ha establecido la afinidad para las tareas lazywriter y logwriter, siguen las mismas reglas definidas para las demás tareas permanentes, como lockmonitor o checkpoint.

Para asegurarse de que la nueva máscara de afinidad es válida, el comando RECONFIGURE comprueba que las afinidades normales de CPU y E/S se excluyen mutuamente. En caso contrario, se envía un mensaje de error a la sesión de cliente y al registro de errores de SQL Server para indicar que no se recomienda dicha configuración. La ejecución de la opción RECONFIGURE WITH OVERRIDE permite afinidades de CPU y E/S que no se excluyen mutuamente.

Si especifica una máscara de afinidad que intenta asignarse a una CPU inexistente, el comando RECONFIGURE envía un mensaje de error a la sesión de cliente y al registro de errores de SQL Server. El uso de la opción RECONFIGURE WITH OVERRIDE no tiene efecto en este caso y se vuelve a enviar el mismo error de configuración.

También puede excluir la actividad de SQL Server de los procesadores a los que el sistema operativo Windows 2000 o Windows Server 2003 han asignado cargas de trabajo específicas. Si establece el valor 1 para un bit que representa un procesador, el motor de base de datos de SQL Server selecciona dicho procesador para la asignación de subprocesos. Si establece el valor 0 (predeterminado) para affinity mask, los algoritmos de programación de Windows 2000 o Windows Server 2003 establecen la afinidad del subproceso. Si establece affinity mask en cualquier valor distinto de cero, la afinidad de SQL Server interpreta el valor como una máscara de bits que especifica los procesadores que se pueden seleccionar.

Mediante la separación de los subprocesos de SQL Server para que se ejecuten en determinados procesadores, Microsoft Windows 2000 o Windows Server 2003 pueden evaluar mejor el control de los procesos específicos de Windows por parte del sistema. Por ejemplo, en un servidor de 8 CPU en el que se ejecutan dos instancias de SQL Server (instancias A y B), el administrador del sistema puede utilizar la opción affinity mask para asignar el primer conjunto de 4 CPU a la instancia A y el segundo conjunto de 4 CPU a la instancia B. Para configurar más de 32 procesadores, establezca las opciones affinity mask y affinity64 mask. Los valores de affinity mask son los siguientes:

  • Una opción affinity mask de un byte cubre hasta 8 CPU en un equipo con varios procesadores.

  • Una opción affinity mask de dos bytes cubre hasta 16 CPU en un equipo con varios procesadores.

  • Una opción affinity mask de tres bytes cubre hasta 24 CPU en un equipo con varios procesadores.

  • Una opción affinity mask de cuatro bytes cubre hasta 32 CPU en un equipo con varios procesadores.

  • Para cubrir más de 32 CPU, configure una opción affinity mask de cuatro bytes para las primeras 32 CPU y una opción affinity64 mask de hasta cuatro bytes para las restantes CPU.

Como la configuración de la afinidad del procesador de SQL Server es una operación especial, se recomienda utilizarla sólo cuando sea necesario. En la mayor parte de los casos, el mejor rendimiento se obtiene con la afinidad predeterminada de Microsoft Windows 2000 o Windows Server 2003. Al configurar las máscaras de afinidad, también debe considerar los requisitos de CPU para otras aplicaciones. Para obtener más información, vea la documentación del sistema operativo Windows.

Nota

Puede utilizar el Monitor de sistema de Windows para ver y analizar el uso individual del procesador.

Al especificar la opción affinity I/O mask, debe usarla en conexión con la opción de configuración affinity mask. No habilite la misma CPU en el modificador affinity mask y la opción affinity I/O mask. Los bits correspondientes a cada CPU deben estar en uno de los tres estados siguientes:

  • 0 tanto en la opción affinity mask como en la opción affinity I/O mask.

  • 1 en la opción affinity mask y 0 en la opción affinity I/O mask.

  • 0 en la opción affinity mask y 1 en la opción affinity I/O mask.

Nota de advertenciaAdvertencia

No configure la afinidad de CPU en el sistema operativo Windows y la máscara de afinidad en SQL Server simultáneamente. Estos valores de configuración intentan lograr el mismo resultado y, si las configuraciones no son coherentes, puede obtener resultados impredecibles. La afinidad de CPU de SQL Server se configura mejor mediante la opción sp_configure de SQL Server.

Ejemplo

Como ejemplo de configuración de la opción affinity mask, si los procesadores 1, 2 y 5 están seleccionados como disponibles con el valor 1 para los bits 1, 2 y 5, y el valor 0 para los bits 0, 3, 4, 6 y 7, se especifica el valor hexadecimal 0x26 o el valor decimal equivalente 38. Enumere los bits de derecha a izquierda. La opción affinity mask comienza a contar los procesadores de 0 a 31, de modo que en el ejemplo siguiente el contador 1 representa el segundo procesador del servidor.

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

A continuación se indican los valores de affinity mask para un sistema con 8 CPU.

Valor decimal

Máscara de bits binarios

Permitir subprocesos de SQL Server en procesadores

1

00000001

0

3

00000011

0 y 1

7

00000111

0, 1 y 2

15

00001111

0, 1, 2 y 3

31

00011111

0, 1, 2, 3 y 4

63

00111111

0, 1, 2, 3, 4 y 5

127

01111111

0, 1, 2, 3, 4, 5 y 6

255

11111111

0, 1, 2, 3, 4, 5, 6 y 7

La opción affinity mask es una opción avanzada. Si va a utilizar el procedimiento almacenado del sistema sp_configure para cambiar la configuración, solo podrá cambiar el valor de affinity mask si show advanced options se establece en 1. Después de ejecutar el comando RECONFIGURE de Transact-SQL, la nueva configuración se aplica inmediatamente sin necesidad de reiniciar la instancia de SQL Server.

Acceso no uniforme a memoria (NUMA)

Cuando se utiliza el acceso no uniforme a memoria (NUMA) basado en hardware y se ha establecido affinity mask, se establecerá la afinidad de cada programador de un nodo con su propia CPU. Cuando no se establece la opción affinity mask, se establece la afinidad de cada programador con el grupo de CPU en un nodo NUMA y un programador asignado al nodo NUMA N1 puede programar trabajos en cualquier CPU del nodo, pero no en las CPU asociadas a otro nodo.

Cualquier operación que se ejecute en un solo nodo NUMA únicamente puede utilizar las páginas de búfer de ese nodo. Cuando una operación se ejecuta en paralelo en las CPU de varios nodos, se puede utilizar la memoria de cualquiera de estos nodos.

Consideraciones acerca de las licencias

La afinidad dinámica está estrictamente restringida por las licencias de CPU. SQL Server no permite la configuración de las opciones de máscara de afinidad que infrinjan las directivas de las licencias.

Inicio

Si una máscara de afinidad especificada infringe las directivas de las licencias durante el inicio de SQL Server o al adjuntar la base de datos, el nivel del motor completará el proceso de inicio o la operación para adjuntar o restaurar la base de datos; después, volverá a establecer en cero el valor de ejecución de sp_configure para la opción affinity mask y enviará un mensaje de error al registro de errores de SQL Server.

Reconfigurar

Si una máscara de afinidad determinada infringe las directivas de las licencias en la ejecución del comando RECONFIGURE de Transact-SQL, se envía un mensaje de error a la sesión de cliente y al registro de errores de SQL Server solicitando que el administrador de la base de datos vuelva a configurar la máscara de afinidad. En este caso no se acepta ningún comando RECONFIGURE WITH OVERRIDE.