Solucionar problemas del regulador de recursos

Este tema proporciona una guía para solucionar problemas de condiciones que se pueden producir al utilizar el regulador de recursos. Esta guía se organiza en las categorías siguientes:

  • Errores

  • Resultados inesperados

  • Problemas y errores relacionados con el rendimiento

Errores del regulador de recursos

Los mensajes de error del regulador de recursos abarcan todas las acciones relacionadas con la configuración y el uso del regulador de recursos.

La tabla siguiente proporciona ejemplos de mensajes de error del regulador de recursos y proporciona una guía para resolver el problema que se describe en el mensaje de error.

Número de error

Mensaje de error

Solución

8645

Se agotó el tiempo de espera para que los recursos de memoria ejecutaran la consulta en el grupo de recursos de servidor 'myTestPool' (257). Vuelva a ejecutar la consulta.

Configure un valor de tiempo de espera mayor o reduzca la carga de la consulta para el servidor.

8651

No se pudo realizar la operación porque la concesión de memoria solicitada no estaba disponible en el grupo de recursos de servidor 'myTestPool' (257). Vuelva a ejecutar la consulta, reduzca la carga de consulta o compruebe la configuración del regulador de recursos.

Vuelva a ejecutar la consulta posteriormente. Reduzca la carga de la consulta en el servidor. Haga que el administrador compruebe la opción de configuración del regulador de recursos.

8657

No se pudo obtener la concesión de memoria de 1024 KB porque supera el límite máximo de configuración del grupo de cargas de trabajo 'myTestGroup' (267) y del grupo de recursos de servidor 'myTestPool' (257). Póngase en contacto con el administrador del servidor para aumentar el límite de uso de la memoria.

Vuelva a escribir la consulta para reducir la memoria que usan operaciones como la ordenación y la combinación hash. Pida al administrador del sistema que permita un límite mayor de utilización de memoria.

El administrador puede ajustar uno o ambos de los parámetros siguientes:

  • max_memory_percent en el grupo de recursos de servidor, que establece el espacio de concesión de memoria física máximo para todas las consultas

  • request_max_memory_grant_percent en los grupos de cargas de trabajo, que establece el límite por consulta.

El administrador puede obtener el límite físico real de la columna max_target_memory_kb de sys.dm_exec_query_resource_semaphores.

El límite por consulta se puede calcular mediante la fórmula max_target_memory_kb * request_max_memory_grant_percent.

NotaNota
El administrador tiene que asegurarse de que la memoria necesaria que se indica en el mensaje de error es menor que el límite por consulta calculado anteriormente. Sin embargo, se debería tener en cuenta que al aumentar el valor de request_max_memory_grant_percent se obtiene el efecto secundario de reducir la simultaneidad de las consultas grandes. Por ejemplo, los usuarios pueden esperar ejecutar tres consultas grandes con la configuración predeterminada del 25 por ciento, pero solo dos consultas grandes con un valor del 40 por ciento.

10900

No se pudo configurar el regulador de recursos durante el inicio. Busque en el registro de errores de SQL Server mensajes de error específicos o compruebe la coherencia de base de datos maestra ejecutando DBCC CHECKCATALOG('master').

Intente ejecutar "DBCC CHECKCATALOG ('master')".

10901

El usuario no tiene permiso para modificar la configuración del regulador de recursos.

Conceda el permiso que permitiría la modificación de la configuración del regulador de recursos y vuelva a intentarlo.

10902

La función definida por el usuario 'dbo.rgclassifier_v1' no existe en base de datos maestra o el usuario no tiene permiso de acceso.

Cree una función clasificadora definida por el usuario (UDF) en maestra o conceda los permisos necesarios en la UDF clasificadora existente.

10903

El nombre de esquema especificado 'dbo' para funciones clasificadoras definidas por el usuario no existe o el usuario no tiene permiso para usarlo.

Pruebe con otro nombre de esquema u obtenga los permisos correctos para este esquema.

10904

Error de configuración del regulador de recursos. Hay sesiones activas en grupos de cargas de trabajo que se están quitando o moviendo a grupos de recursos de servidor distintos. Desconecte todas las sesiones activas en los grupos de cargas de trabajo afectados e inténtelo de nuevo.

Desconecte todas las sesiones activas en los grupos afectados e inténtelo de nuevo.

NotaNota
Esta versión del regulador de recursos no permite que los grupos se muevan entre grupos cuando hay sesiones abiertas en ellos.

10905

No se pudo completar la configuración del regulador de recursos porque no hay suficiente memoria. Reduzca la carga del servidor o intente la operación en una conexión de administrador dedicada.

Reduzca la carga en del servidor o intente una operación de configuración en una conexión de administrador dedicada.

10906

El objeto 'dbo'. 'rgclassifier_v1' no es una función clasificadora definida por el usuario válida del regulador de recursos. Una función válida de este tipo debe estar enlazada a un esquema y devolver sysname, y no debe tener parámetros.

Proporcione una UDF clasificadora válida. Una UDF clasificadora válida debe:

  • Devolver sysname.

  • No tener ningún parámetro.

  • Crearse con la opción SCHEMABINDING.

10907

El valor del atributo 'MIN_CPU_PERCENT', 50, es mayor que el valor del atributo 'MAX_CPU_PERCENT', 40.

Proporcione un valor mínimo que sea menor o igual que el valor máximo.

10908

El valor del atributo 'MAX_MEMORY_PERCENT', 40, es menor que el valor del atributo 'MIN_MEMORY_PERCENT', 60.

Proporcione un valor máximo que sea mayor o igual que el valor mínimo.

10909

No se puede crear el grupo de recursos de servidor. El número máximo de grupos de recursos de servidor no puede superar el límite actual de 20, incluidos los grupos de recursos de servidor predefinidos.

Quite grupos de recursos de servidor que no se necesiten.

10910

No se pudo completar la operación. El valor de 'MIN_CPU_PERCENT' especificado, 25, hace que la suma de mínimos en todos los grupos de recursos de servidor supere el 100 por ciento. Reduzca el valor o modifique otros grupos de recursos de servidor de forma que la suma sea menor que 100.

Reduzca el valor para MIN_CPU_PERCENT.

10911

No se puede realizar la operación solicitada porque el grupo de recursos de servidor 'myTestPool2' no existe.

Consulte la vista de catálogo sys.resource_governor_resource_pools para ver qué grupos de recursos de servidor están definidos actualmente. Elija un grupo existente o cree un grupo nuevo.

10912

No se pudo completar la operación. No se permite quitar el grupo de cargas de trabajo predefinido.

Elija un grupo de cargas de trabajo creado por el usuario que quitar.

10913

Los usuarios no pueden eliminar el grupo de cargas de trabajo 'interno' en el grupo de recursos de servidor 'interno'.

Cree el grupo de cargas de trabajo en un grupo creado por el usuario o en el grupo predeterminado.

10914

El nombre del grupo de cargas de trabajo '#mygroup' no puede empezar con # de ##.

No utilice # o ## al crear un grupo.

10915

No se pudo completar la operación. No se permite modificar el grupo de cargas de trabajo 'interno'.

Elija un grupo creado por el usuario para modificarlo.

Nota   Se puede cambiar la configuración del grupo de recursos de servidor o del grupo predeterminado.

10916

No se puede quitar el grupo de recursos de servidor 'myTestPool' porque contiene el grupo de cargas de trabajo 'myTestGroup'. Quite o desconecte todos los grupos de cargas de trabajo que utilizan este grupo de recursos de servidor antes de quitarlo.

Quite o mueva todos los grupos de cargas de trabajo que utilizan este grupo y, a continuación, quite el grupo.

10917

Error de ALTER WORKLOAD GROUP. Se debe especificar una cláusula 'WITH' o 'USING'.

Utilice la cláusula 'WITH' o 'USING' en la instrucción ALTER WORKLOAD GROUP.

10918

No se puede crear el grupo de recursos de servidor 'myTestPool' porque ya existe.

Elija un nombre de grupo de recursos de servidor diferente.

10919

Error al leer la configuración del regulador de recursos de la base de datos maestra. Compruebe la integridad de base de datos maestra o póngase en contacto con el administrador del sistema.

Intente ejecutar "DBCC CHECKCATALOG ('master')".

10920

No se puede quitar la función definida por el usuario 'dbo.myclassifer'. Se está utilizando como clasificador del regulador de recursos.

Ninguna.

10921

El grupo de cargas de trabajo 'predeterminado' no se puede sacar del grupo de recursos de servidor 'predeterminado'.

No aplicable.

10981

La reconfiguración del regulador de recursos se completó correctamente.

Este mensaje se escribe en el registro de eventos de SQL Server.

10982

No se pudo ejecutar la función clasificadora definida por el usuario del regulador de recursos. Vea los detalles de los errores anteriores en el registro de errores de SQL Server para el id. de sesión 58. Tiempo transcurrido de la función clasificadora: 800 ms.

Este mensaje se escribe en el registro de errores de SQL Server.

Nota   Los mensajes del registro de errores de SQL Server anteriores con el mismo identificador de proceso de servidor (SPID) pueden proporcionar los motivos concretos del error. Un clasificador que se ejecute durante un largo período de tiempo puede ocasionar que se agote el tiempo de espera de inicio de sesión de usuario. Compruebe si el tiempo transcurrido para la clasificación supera el tiempo de espera de inicio de sesión de cliente.

10983

El usuario canceló la reconfiguración del regulador de recursos.

No aplicable.

10984

Error de reconfiguración del regulador de recursos.

No aplicable.

Resultados inesperados

Los resultados inesperados describen las situaciones en las que los diversos elementos del regulador de recursos funcionan, pero los resultados no son los previstos. Por ejemplo, parece que la clasificación de la sesión no funciona correctamente o hay problemas cuando se quitan o crean los grupos de cargas de trabajo.

Clasificación de la sesión

Las sesiones irán al grupo de cargas de trabajo predeterminado cuando se den las condiciones siguientes:

  • La UDF clasificadora no existe o no está habilitada.

  • La UDF clasificadora las coloca allí, lo que indica un error en la lógica de la función.

Métodos básicos de solución de problemas

Si no hay ninguna UDF clasificadora disponible para la clasificación, todas las sesiones irán automáticamente al grupo de cargas de trabajo predeterminado. Después de crear una UDF clasificadora, tiene que comprobar que se registra con el regulador de recursos y que la configuración en memoria se actualiza.

Crear, registrar y habilitar una UDF clasificadora es un proceso que consta de tres pasos:

  • En primer lugar, es necesario crear la función.

    CREATE FUNCTION function_name() RETURNS <something> 
    WITH SCHEMABINDING
    
  • En segundo lugar, hay que registrar la función con el regulador de recursos.

    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=schema_name.function_name)
    
  • En tercer lugar, hay que actualizar la configuración en memoria del regulador de recursos.

    ALTER RESOURCE GOVERNOR RECONFIGURE
    

Lo primero que hay que hacer al solucionar problemas de clasificación es comprobar que la función que se creó está registrada con el regulador de recursos y que la configuración se actualizó. Utilice la consulta siguiente para obtener el nombre de esquema (schema_name) y el nombre de la función clasificadora (function_name) para la UDF clasificadora que el regulador de recursos usa actualmente.

USE master
SELECT 
      object_schema_name(classifier_function_id) AS [schema_name],
      object_name(classifier_function_id) AS [function_name]
FROM sys.dm_resource_governor_configuration

Puede utilizar el enfoque anterior para solucionar problemas en un escenario en el que se cambió la UDF clasificadora, pero donde el regulador de recursos todavía use la lógica de función anterior para clasificar las sesiones. Este comportamiento indica que los cambios que realizó no se aplicaron a la configuración en memoria.

Solución avanzada de problemas

Puede crear una función clasificadora muy compleja que no genere los resultados esperados o que use en gran medida los recursos. Si ha aplicado los métodos básicos de solución de problemas, tiene que comprobar que la lógica de la función es apropiada. El peor escenario es aquel en el que un error en la codificación provoca un bucle sin fin o una consulta descontrolada.

Puede utilizar una conexión de administrador dedicada (DAC) para solucionar los problemas de una función clasificadora mal escrita, porque no está sujeta a clasificación y se puede utilizar mientras el regulador de recursos está ejecutándose y clasificando las sesiones entrantes. Para obtener más información, vea Usar una conexión de administrador dedicada.

[!NOTA]

Si no hay ninguna conexión de administrador dedicada disponible para solucionar problemas, puede reiniciar el sistema en modo de usuario único. Aunque el modo de usuario único no está sujeto a clasificación, no se puede diagnosticar la clasificación del regulador de recursos mientras se ejecuta.

Al consultar lo siguiente, obtiene información sobre la función clasificadora:

  • sys.dm_exec_query_stats. (contiene información de la instrucción pero no la función real)

  • sys.dm_exec_sql_text (se utiliza junto con sql_handle obtenido de sys.dm_exec_query_stats)

  • Clase de eventos PreConnect:Starting (proporciona el identificador y el nombre de la función clasificadora)

Errores de la reconfiguración

El regulador de recursos conserva los cambios de los metadatos independientes de las sesiones de ejecución hasta que se completa la instrucción ALTER RESOURCE GOVERNOR RECONFIGURE. ALTER RESOURCE GOVERNOR RECONFIGURE generará un error si intenta quitar un grupo que contenga sesiones activas o abiertas, o si intenta quitar un grupo de recursos de servidor que contenga grupos de cargas de trabajo.

Para obtener la configuración en memoria y la configuración almacenada, consulte sys.dm_resource_governor_configuration y sys.resource_governor_configuration respectivamente. El valor 1 para is_reconfiguration_pending (sys.dm_resource_governor_configuration) indica que la configuración de la sesión no se ha actualizado. Si éste es el caso, las opciones son las siguientes:

  • Espere a que las sesiones finalicen o quite su conexión.

  • Detenga explícitamente la sesión activa o quite la conexión de sesión.

  • Vuelva a crear el grupo que quitó, ajuste sus valores y vuelva a ejecutar ALTER RESOURCE GOVERNOR RECONFIGURE.

Problemas y errores relacionados con el rendimiento

Si parece que hay problemas de rendimiento al utilizar el regulador de recursos, es necesario determinar si el problema se debe a la configuración del regulador de recursos o no. La guía de solución de problemas proporcionada en esta sección se agrupa en dos categorías:

  • Clasificación de la sesión

  • Ejecución de la consulta

Clasificación de la sesión

Un desencadenador de inicio de sesión o una función definida por el usuario (UDF) clasificadora que se ejecuten durante un largo período pueden afectar al rendimiento del servidor. Si el desencadenador de inicio de sesión o la UDF clasificadora tardan mucho tiempo en completarse, se agota el tiempo de espera de la conexión. Sin embargo, el desencadenador o la función continúan ejecutándose y utilizando los recursos del servidor.

Si sospecha que hay sesiones que se ejecutan en un estado anterior a la conexión, inicie sesión usando la conexión de administrador dedicada y compruebe Clase de evento PreConnect:Starting para determinar si hay varias solicitudes o sesiones que se han iniciado pero no se han completado.

Para resolver este problema y evitar que vuelva a producirse:

  • Detenga las sesiones.

  • Identifique las causas probables de que la función o el desencadenador de inicio de sesión tarden en ejecutarse.

  • Quite y reemplace el desencadenador o función que están ocasionando el problema.

Ejecución de la consulta

Una vez que una consulta se ha clasificado y está ejecutándose, puede parecer que deja de responder o produce un error. Sospecha que la configuración actual del regulador de recursos puede ser la causa. Tiene que investigar los aspectos siguientes de la configuración del regulador de recursos:

  • Limitación del número de solicitudes

  • Límite máximo de CPU

  • Límite de ancho de banda de CPU

  • Tamaño de concesión de memoria

  • Error de tiempo de espera de concesión de memoria

  • Error de memoria insuficiente

  • Plan de consulta poco óptimo

Limitación del número de solicitudes

En este escenario, un usuario informa de la degradación del rendimiento y se sospecha que el número de solicitudes está limitado.

En primer lugar, hay que comprobar si se ha configurado explícitamente una limitación del número de solicitudes para el grupo en el que se encuentra el usuario. Para ello, se comprueba la pertenencia al grupo del usuario con el fin de averiguar si el valor de GROUP_MAX_REQUESTS está o no habilitado. Si GROUP_MAX_REQUESTS no está habilitado, no hay ninguna limitación explícita en el número de solicitudes. Debería seguir investigando mediante este procedimiento.

  • Consulte sys.dm_os_waiting_tasks para comprobar si hay alguna solicitud esperando en el tipo de espera RESMGR_THROTTLED. La presencia de este tipo de espera indica la limitación del número de solicitudes.

  • Inicie el Monitor de rendimiento y recopile datos con los contadores Solicitudes en cola y Solicitudes activas. Un valor distinto de cero en Solicitudes en cola indica la limitación de las solicitudes.

  • Compruebe si el valor de Solicitudes activas coincide con el valor de GROUP_MAX_REQUESTS. Si el valor de Solicitudes activas es mayor que el de GROUP_MAX_REQUESTS, el grupo puede tener solicitudes que no se puedan limitar (por ejemplo, las transacciones abiertas).

  • Si el valor de Solicitudes en cola es cero, compruebe el valor de Solicitudes activas de todos los grupos de cargas de trabajo que comparten el mismo grupo de recursos de servidor porque el grupo se puede haber sobrecargado con demasiadas solicitudes.

Límite máximo de CPU

Si tiene una directiva que se controla a través de la generación de eventos del regulador de recursos, puede utilizar el evento que se genera cuando se alcanza el límite máximo de la CPU.

En este escenario, desea determinar si el límite de CPU máximo (REQUEST_MAX_CPU_TIME_SEC) que configuró para detectar que una consulta usa demasiada CPU es muy bajo.

Las acciones siguientes le ayudarán a validar el valor de límite de CPU.

  • Inicie una sesión de Seguimiento SQL y recopile el evento Umbral de CPU superado. Cuando una solicitud del usuario alcanza el límite de uso de CPU máximo, el servidor genera automáticamente un evento de Seguimiento SQL. Si su valor es demasiado bajo, se generará una gran cantidad de estos eventos.

[!NOTA]

Este evento también se expone como una notificación de eventos del servidor de modo que pueda escribir un script que reaccione al evento.

  • Inicie el Monitor de rendimiento y recopile datos con el contador Tiempo máximo de CPU por solicitud (ms). Puede utilizar el valor de este contador como guía para establecer el límite adecuado para el grupo de cargas de trabajo.

Límite de ancho de banda de CPU

En este escenario, sospecha que el ancho de banda de CPU está limitado porque el contador de rendimiento CPU usage % está cercano al valor MAX_CPU_PERCENT del regulador de recursos. La consulta siguiente devuelve el valor del porcentaje de uso de la CPU para todos los grupos de cargas de trabajo y grupos de recursos de servidor de una instancia de SQL Server.

select * from sys.dm_os_performance_counters where counter_name = 'cpu usage %'

Para obtener más información, vea sys.dm_os_performance_counters (Transact-SQL).

Puede determinar si el ancho de banda de la CPU está limitado o no realizando las comprobaciones siguientes en el sistema.

  • Compruebe la utilización de la CPU del servidor total. Si una carga distinta de SQL Server está activa actualmente, puede afectar a la consulta cuyos problemas está solucionando.

  • Compruebe la distribución del uso de la CPU entre los grupos de recursos de servidor. Un grupo de recursos de servidor podría estar limitado porque otro grupo tenga un valor mínimo alto configurado para el uso de CPU. Compare los contadores de la utilización de CPU esperada (utilización de la CPU calculada) con respecto a la utilización de la CPU real.

  • Compruebe los grupos de cargas de trabajo asignados al grupo de recursos de servidor en cuestión. La carga de otros grupos de cargas de trabajo puede afectar a los usuarios que comparten el mismo grupo.

  • Compruebe la distribución del uso de la CPU a través de los programadores. La consulta que está investigando podría estar colocada en un programador que contenga consultas de ejecución prolongada. En este caso, la consulta puede parecer que está limitada, pero el problema real es la distribución desigual de la carga entre los programadores.

  • Compruebe los posibles casos en los que otras sesiones bloquean la carga de trabajo en lugar de estar limitada por la configuración del regulador de recursos.

  • Compruebe el número de sesiones que ejecutan actualmente consultas en el sistema. A medida que el número de solicitudes de ejecución simultáneas crece, SQL Server intenta asegurarse de que todas ellas están recibiendo al menos alguna cantidad de tiempo de CPU para evitar el colapso de la CPU.

Tamaño de concesión de memoria

En este escenario, sospecha que el tamaño de memoria concedida está haciendo que una consulta se ejecute despacio.

El regulador de recursos aplica el límite máximo de memoria de consulta reduciendo la memoria concedida de forma que las consultas grandes puedan caber dentro del límite. Si una consulta es menor que el 100% de la memoria concedida, puede ser necesario retirar los datos temporales y escribirlos en el disco, lo que puede tener un efecto notable en el rendimiento.

Es necesario determinar el porcentaje de consultas grandes para establecer el límite de tamaño de consulta máximo apropiado. Los procedimientos siguientes ayudarán a determinar los mejores valores:

  • Consulte sys.dm_exec_query_memory_grants para comprobar el estado actual de las concesiones de memoria. La columna ideal_memory_kb muestra la cantidad ideal según la estimación de la cardinalidad. La columna requested_memory_kb muestra la cantidad pedida que se podría haber reducido después de alcanzar el límite de consulta máximo. Si requested_memory_kb es significativamente menor que ideal_memory_kb, la consulta puede terminar rebosando con frecuencia (suponiendo que la estimación de la cardinalidad sea correcta).

  • Inicie el Monitor de rendimiento y recopile datos con el contador Concesiones con memoria reducida/s. El valor de este contador representa la tasa del recuento de la concesión de memoria que recibió menos de la cantidad ideal después de llegar al límite máximo de tamaño de la solicitud. Las consultas grandes pueden ejecutarse mucho más lentamente que aquellas con una cantidad ideal porque necesitan retirarse al disco para mantenerse dentro de los límites de memoria.

Para aliviar un problema de concesión de memoria, puede que haya que aumentar el límite de tamaño del grupo o el límite del tamaño máximo de la memoria.

[!NOTA]

Si solo aumenta el tamaño máximo de la memoria, puede provocar que se reduzca la simultaneidad de las consultas grandes.

Error de tiempo de espera de concesión de memoria

En este escenario, se produce un error en una consulta con un error de tiempo de espera de concesión de memoria.

Tanto el número total de solicitudes de concesión de memoria activas como los límites de memoria especificados en el grupo de recursos de servidor y en el grupo de cargas de trabajo pueden representar un rol en los tiempos de espera de concesión de memoria. Si varios grupos de recursos comparten un único grupo de recursos de servidor, el número de consultas simultáneas en otros grupos también puede afectar a los tiempos de espera de concesión de memoria.

Las acciones siguientes ayudarán a determinar la mejor configuración de los grupos de recursos de servidor:

  • Consulte sys.dm_exec_query_memory_grants para ver el número de concesiones de memoria y las consultas de espera de este grupo.

  • Consulte sys.dm_exec_query_resource_semaphores para comprobar la memoria concedida total y el destino.

Si la utilización de memoria concedida es mayor que el espacio de memoria disponible, puede considerar aumentar el límite de tamaño del grupo de recursos de servidor.

Errores de memoria insuficiente

Se produce un error de memoria insuficiente en una consulta.

Métodos básicos de solución de problemas

Las acciones siguientes ayudarán a determinar la mejor configuración de los grupos de cargas de trabajo:

  • Consulte sys.dm_os_memory_brokers para comprobar la distribución de la memoria relativa y la tendencia dentro del grupo de recursos de servidor. Demasiadas solicitudes en un espacio de memoria demasiado pequeño puede provocar la sobrecarga de los grupos de recursos de servidor o de cargas de trabajo, y ocasionar errores de memoria insuficiente.

  • Inicie el Monitor de rendimiento y recopile datos utilizando los contadores del grupo de recursos de servidor relacionados con la memoria, para obtener la utilización de memoria de destino y actual de las concesiones de memoria, la memoria almacenada en la memoria caché y la memoria de compilación y del optimizador. Si los valores actuales son mayores que los valores de destino, significa que el grupo de recursos de servidor está sobrecargado. Considere cambiar los límites de memoria del grupo.

  • Inicie el Monitor de rendimiento y recopile datos mediante el contador request max memory grant. Si el valor del contador supera el valor determinado por la configuración de REQUEST_MAX_MEMORY_GRANT_PERCENT en el grupo de cargas de trabajo, la consulta probablemente producirá un error. Considere cambiar el límite del grupo de cargas de trabajo.

Solución avanzada de problemas

El error de memoria insuficiente (701) es un error genérico que se devuelve cuando las tareas intentan asignar un bloque de memoria del administrador de memoria y el intento no tiene éxito. Para obtener más información, vea MSSQLSERVER_701.

Las condiciones siguientes pueden producir este error:

  • El bloque de memoria alcanza su límite total.

[!NOTA]

El regulador de recursos puede no ser la única causa de esta condición. Puede haber otras aplicaciones que se ejecuten en el servidor que necesiten memoria y que contribuyan a esta condición.

  • La asignación del espacio de direcciones virtuales o de varias páginas produce un error porque el espacio de direcciones virtuales no tiene un bloque libre suficientemente grande para la reserva necesaria. Esto es probable que se produzca en una arquitectura de 32 bits y es improbable que ocurra en una arquitectura de 64 bits.

  • La asignación del espacio de direcciones virtuales o de varias páginas produce un error porque el compromiso total llega al límite confirmado. Esto se aplica a las arquitecturas de 32 y de 64 bits.

Cuando aparezca el error de memoria insuficiente, el registro de errores es el mejor punto de partida para investigarlo. El registro contiene una salida similar a la siguiente:

2006-01-28 04:27:15.43 spid51 Error al asignar páginas: FAIL_PAGE_ALLOCATION 1

Los posibles errores que se graban en el registro de errores son:

  • FAIL_PAGE_ALLOCATION seguido del número de páginas que se intentó asignar

  • FAIL_VIRTUAL_RESERVE seguido del número de bytes que se intentó reservar

  • FAIL_VIRTUAL_COMMIT seguido del número de bytes que se intentó confirmar

Es importante saber que la tarea que desencadenó el error de memoria insuficiente a menudo no es la que lo ocasionó. A menos que haya una tarea descontrolada, la condición de memoria insuficiente suele ser la culminación de varias tareas en ejecución. Como resultado, tomando el caso muy común de un error FAIL_PAGE_ALLOCATION, la investigación debe abarcar una vista mayor de la actividad del sistema.

El valioso fragmento de información siguiente del registro de errores es la salida del estado de la memoria. En función del error, debería buscar cifras correspondientes a la memoria de una sola página, de varias páginas, virtual reservada o confirmada para empleados de memoria individuales. Identificar a los mayores consumidores de memoria es un paso clave para continuar investigando el error. Normalmente, los mayores consumidores de memoria son de los tipos siguientes:

  • MEMORYCLERK_ * significa que la configuración del servidor o la carga de trabajo requieren una asignación de memoria concreta. Hay empleados de memoria correspondientes para los componentes de SQL Server y los componentes individuales pueden tener varios empleados de memoria. Para obtener más información, vea sys.dm_os_memory_clerks (Transact-SQL). A veces, puede identificar la carga de trabajo que ocasiona el problema entre los empleados de memoria, pero es más probable que tenga que examinar los objetos de memoria asociados a los empleados para averiguar lo que produjo el gran consumo de memoria.

  • CACHESTORE_*, USERSTORE_*, OBJECTSTORE_* son los tipos de memoria caché. Un elevado consumo de memoria en una memoria caché puede significar que:

    • La memoria se asigna fuera de la memoria caché pero aún no se ha insertado como una entrada que se pueda expulsar. Esto es muy similar al caso de MEMORYCLERK anterior.

    • Todas las entradas de la memoria caché se están usando y no se pueden expulsar. Esto se puede confirmar examinando sys.dm_os_memory_cache_counters y comparando los valores de las columnas entries_count y entries_in_use_count.

  • MEMORYCLERK_SQLQERESERVATIONS muestra cuánta memoria ha reservado la ejecución de la consulta (QE) para ejecutar consultas con ordenaciones o combinaciones. Un error de memoria insuficiente que se produce cuando las reservas son altas normalmente indica un error en el servidor.

La salida del estado de memoria en el registro de errores también mostrará qué bloque de memoria está agotado. Los agentes de memoria de cada grupo muestran la distribución de memoria robada (compilación), almacenada en memoria caché y reservada (concedida). Los números correspondientes a los tres agentes corresponden a los objetos de memoria anteriores asociados a los empleados de memoria. Puede averiguar cuánta memoria se asigna para un grupo de un empleado u objeto de memoria determinado extrayendo la información de un volcado completo con un script personalizado y la vista de administración dinámica sys.dm_os_memory_cache_entries, que muestra el pool_id al que cada entrada está asociada.

Si necesita ponerse en contacto con los servicios de soporte al cliente, recopile la información siguiente para nuestro personal de soporte técnico:

  • El registro de errores que muestra el error de memoria insuficiente y la salida del estado de memoria en el momento del error.

  • La salida de las instrucciones siguientes:

    dbcc memorystatus
    dbcc sqlperf(spinlockstats)
    select * from sys.dm_os_memory_clerks
    select * from sys.dm_os_wait_stats order by wait_type
    select * from sys.dm_os_waiting_tasks
    select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_OOM'
    select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_RESOURCE_MONITOR'
    select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_MEMORY_BROKER'
    select * from sys.dm_os_memory_cache_clock_hands
    
  • Si se desea, un volcado de memoria insuficiente, recopilado con T8004. Este volcado mínimo contendrá valiosa información como los búferes de anillo y las estadísticas de esperas o bloqueos por bucle. El contador de volcado para T8004 se puede restablecer sin reiniciar el servidor desactivando T8004 y volviéndolo a activar.

Plan de consulta poco óptimos

En este escenario, sospecha que una consulta se está ejecutando despacio debido a un plan de consulta poco óptimo. El optimizador de consultas puede generar un plan de consulta poco óptimo si no tiene bastante memoria debido a un valor de límite de memoria baja para un grupo de recursos de servidor.

Las acciones siguientes ayudarán a determinar la mejor configuración de los grupos de recursos de servidor:

  • Obtenga los datos del contador Optimizaciones de consultas/s para comprobar si el grupo de cargas de trabajo tiene un número alto o no de compilaciones de consultas.

  • Obtenga los datos del contador Planes poco óptimos/s para comprobar si el optimizador de consultas genera con frecuencia planes poco óptimos.

Si se da alguna de las condiciones anteriores, considere aumentar el límite de memoria del grupo de recursos de servidor.