Resolver problemas de memoria insuficiente

Se aplica a: síSQL Server (todas las versiones admitidas)

OLTP en memoria de SQL Server usa más memoria y de maneras diferentes que SQL Server. Es posible que la cantidad de memoria que instaló y asignó para OLTP en memoria no sea suficiente para sus necesidades en crecimiento. En ese caso, podría quedarse sin memoria. En este tema se describe cómo recuperarse de una situación de OOM (memoria insuficiente). Vea Supervisar y solucionar problemas del uso de la memoria para obtener instrucciones específicas que pueden ayudarle a evitar muchas situaciones de memoria insuficiente.

Las secciones de este tema son:

Tema Información general
Resolver errores de restauración de bases de datos debidos a memoria insuficiente Se indica lo que debe hacer si aparece el mensaje de error "Error en la operación de restauración para la base de datos " <databaseName> " debido a memoria insuficiente en el grupo de recursos de servidor " <resourcePoolName> "".
Resolver el impacto de las condiciones de memoria insuficiente u OOM en la carga de trabajo Se describe lo que hay que hacer si percibe que las condiciones de memoria insuficiente están afectando negativamente al rendimiento.
Resolver los errores de asignación de páginas debidos a memoria insuficiente cuando hay suficiente memoria disponible Se indica lo que debe hacer si aparece el mensaje de error "No se permiten asignaciones de páginas para la base de datos " <databaseName> " debido a memoria insuficiente en el grupo de recursos de servidor " <resourcePoolName> "". ..." cuando hay suficiente memoria disponible para la operación.
Prácticas recomendadas: usar OLTP en memoria en un entorno de máquinas virtuales Qué debe tener en cuenta al usar OLTP en memoria en un entorno virtualizado.

Resolver errores de restauración de bases de datos debidos a memoria insuficiente

Cuando intenta restaurar una base de datos, es posible que obtenga el mensaje de error "No se pudo realizar la operación de restauración para la base de datos " <databaseName> " debido a que la memoria es insuficiente en el grupo de recursos " <resourcePoolName> "". Esto indica que el servidor no tiene suficiente memoria disponible para restaurar la base de datos.

El servidor en el que restaura una base de datos debe tener suficiente memoria disponible para las tablas optimizadas para memoria en la copia de seguridad de la base de datos; de lo contrario, la base de datos no se conectará y se marcará como sospechosa.

Si el servidor tiene suficiente memoria física, pero todavía aparece este error, es posible que otros procesos estén utilizando demasiada memoria o un problema de configuración hace que no haya suficiente memoria disponible para la restauración. Para esta clase de problemas, lleve a cabo las siguientes medidas para que haya más memoria disponible para la operación de restauración:

  • Cierre provisionalmente las aplicaciones en ejecución.
    Al cerrar una o varias aplicaciones en ejecución o detener servicios que no se necesiten en el momento, dejará libre la memoria que están usando para la operación de restauración. Puede reiniciarlas una vez haya completado correctamente la restauración.

  • Aumente el valor de MAX_MEMORY_PERCENT.
    Si la base de datos está enlazada a un grupo de recursos, que es la práctica recomendada, la memoria disponible para restaurar se rige por MAX_MEMORY_PERCENT. Si el valor es demasiado bajo, se producirá un error en la restauración. Este fragmento de código cambia el valor MAX_MEMORY_PERCENT para el grupo de recursos de servidor PoolHk y lo establece en el 70 % de la memoria instalada.

    Importante

    Si el servidor se está ejecutando en una máquina virtual y no está dedicado, establezca el valor de MIN_MEMORY_PERCENT en el mismo valor que MAX_MEMORY_PERCENT.
    Vea el tema Prácticas recomendadas: usar OLTP en memoria en un entorno de máquinas virtuales para obtener más información.

    -- disable resource governor  
    ALTER RESOURCE GOVERNOR DISABLE  
    
    -- change the value of MAX_MEMORY_PERCENT  
    ALTER RESOURCE POOL PoolHk  
    WITH  
         ( MAX_MEMORY_PERCENT = 70 )  
    GO  
    
    -- reconfigure the Resource Governor  
    --    RECONFIGURE enables resource governor  
    ALTER RESOURCE GOVERNOR RECONFIGURE  
    GO  
    
    

    Para obtener información sobre los valores máximos para MAX_MEMORY_PERCENT, vea la sección del tema Porcentaje de memoria disponible para tablas e índices optimizados para memoria.

  • Aumente la memoria máxima del servidor.
    Para obtener información acerca de cómo configurar memoria de servidor máxima, vea el tema Opciones de configuración de memoria del servidor.

Resolver el impacto de las condiciones de memoria insuficiente u OOM en la carga de trabajo

Evidentemente, es mejor no verse en una situación de memoria insuficiente u OOM. Un planeamiento y supervisión adecuados puede ayudar a evitar situaciones OOM. Aún así, incluso el mejor planeamiento no siempre puede prever lo que sucede en realidad y podría terminar con un problema de memoria insuficiente u OOM. Hay dos pasos para recuperarse de una situación OOM:

  1. Abrir una DAC (conexión de administrador dedicada)

  2. Tomar una acción correctora

Abrir una DAC (conexión de administrador dedicada)

SQL Server proporciona una conexión de administrador dedicada (DAC). La DAC permite a los administradores acceder a una instancia en ejecución del motor de base de datos de SQL Server para solucionar problemas en el servidor, aunque el servidor no responda a otras conexiones de cliente. DAC está disponible a través de la utilidad sqlcmd y SQL Server Management Studio.

Para obtener instrucciones sobre el uso de DAC a través de SSMS o sqlcmd, consulte Conexión de diagnóstico para administradores de bases de datos.

Tomar una acción correctora

Para resolver la situación OOM, deberá liberar memoria existente reduciendo su uso u obtener más memoria disponible para las tablas en memoria.

Libere memoria existente

Elimine las filas que no sean esenciales de la tabla con optimización para memoria y espere a la recolección de elementos no utilizados

Puede quitar filas no esenciales de una tabla con optimización para memoria. El recolector de elementos no utilizados devuelve la memoria que usaban estas filas a la memoria disponible. El motor de OLTP en memoria recopila filas de elementos no utilizados de forma intensa. Sin embargo, una transacción de ejecución prolongada puede impedir la recolección de elementos no utilizados. Por ejemplo, si hay una transacción que se ejecuta durante cinco minutos, no se pueden recopilar las versiones de filas no utilizadas creadas con las operaciones de actualización o eliminación mientras la transacción estaba activa.

Mover una o varias filas a una tabla basada en disco

Los siguientes artículos de TechNet proporcionan instrucciones para mover filas de una tabla optimizada para memoria a una tabla basada en disco.

Aumente la cantidad de memoria disponible

Aumente el valor de MAX_MEMORY_PERCENT en el grupo de recursos de servidor

Si no ha creado un grupo de recursos de servidor con nombre para las tablas en memoria, debe hacerlo y enlazar las bases de datos de OLTP en memoria al mismo. Vea el tema Enlazar una base de datos con tablas con optimización para memoria a un grupo de recursos de servidor para obtener instrucciones sobre cómo crear y enlazar sus bases de datos de OLTP en memoria a un grupo de recursos.

Si la base de datos de OLTP en memoria está enlazada a un grupo de recursos de servidor, es posible que pueda aumentar el porcentaje de memoria a la que puede tener acceso el grupo. Vea el subtema Cambiar MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT en un grupo existente para obtener instrucciones sobre cómo cambiar el valor de MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT de un grupo de recursos.

Aumente el valor de MAX_MEMORY_PERCENT.
Este fragmento de código cambia el valor MAX_MEMORY_PERCENT para el grupo de recursos de servidor PoolHk y lo establece en el 70 % de la memoria instalada.

Importante

Si el servidor se está ejecutando en una máquina virtual y no está dedicado, establezca el valor de MIN_MEMORY_PERCENT en el mismo valor que MAX_MEMORY_PERCENT.
Vea el tema Prácticas recomendadas: usar OLTP en memoria en un entorno de máquinas virtuales para obtener más información.

-- disable resource governor  
ALTER RESOURCE GOVERNOR DISABLE  
  
-- change the value of MAX_MEMORY_PERCENT  
ALTER RESOURCE POOL PoolHk  
WITH  
     ( MAX_MEMORY_PERCENT = 70 )  
GO  
  
-- reconfigure the Resource Governor to enabled it
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

Para obtener información sobre los valores máximos para MAX_MEMORY_PERCENT, vea la sección del tema Porcentaje de memoria disponible para tablas e índices optimizados para memoria.

Instale memoria adicional

En última instancia, si es posible, la mejor solución es instalar memoria física adicional. Si lo hace, recuerde que seguramente también podrá aumentar el valor de MAX_MEMORY_PERCENT (vea el subtema Cambiar MIN_MEMORY_PERCENT y MAX_MEMORY_PERCENT en un grupo existente), ya que SQL Server probablemente no necesitará más memoria, lo que permitirá asignar toda o gran parte de la memoria nueva instalada al grupo de recursos de servidor.

Importante

Si el servidor se está ejecutando en una máquina virtual y no está dedicado, establezca el valor de MIN_MEMORY_PERCENT en el mismo valor que MAX_MEMORY_PERCENT.
Vea el tema Prácticas recomendadas: usar OLTP en memoria en un entorno de máquinas virtuales para obtener más información.

Resolver los errores de asignación de páginas debidos a memoria insuficiente cuando hay suficiente memoria disponible

Si recibe el mensaje de error, Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'https://go.microsoft.com/fwlink/?LinkId=330673' for more information. en el registro de errores cuando hay suficiente memoria física disponible para asignar la página, puede ser debido a un regulador de recursos deshabilitado. Cuando el Regulador de recursos está deshabilitado, MEMORYBROKER_FOR_RESERVE induce una presión de memoria artificial.

Para resolver este problema necesita habilitar el Regulador de recursos.

Vea Habilitar el regulador de recursos para obtener información sobre los límites y las restricciones, así como instrucciones para habilitar el Regulador de recursos mediante el Explorador de objetos, propiedades del Regulador de recursos o Transact-SQL.

Prácticas recomendadas: usar OLTP en memoria en un entorno de máquinas virtuales

La virtualización del servidor puede ayudar a reducir la inversión y los costos operativos de TI y aumentar la eficacia de TI con mejores procesos de aprovisionamiento, mantenimiento, disponibilidad, copia de seguridad y recuperación. Con los avances tecnológicos recientes, es más fácil consolidar cargas de trabajo de base de datos complejas gracias a la virtualización. En este tema se tratan las prácticas recomendadas para usar OLTP en memoria de SQL Server en un entorno virtualizado.

Asignación previa de memoria

Respecto a la memoria en un entorno virtualizado, son aspectos esenciales un mejor rendimiento y mayor compatibilidad. Debe ser capaz de asignar memoria rápidamente a las máquinas virtuales en función de sus requisitos (cargas pico y fuera de horas pico) y asegurarse de que la memoria no se desperdicia. La característica de memoria dinámica de Hyper-V aumenta la agilidad de cómo se asigna y administra la memoria entre las máquinas virtuales que se ejecutan en un host.

Es necesario modificar algunas prácticas recomendadas para virtualizar y administrar SQL Server cuando se virtualiza una base de datos con tablas optimizadas para memoria. Sin tablas optimizadas para memoria, dos de los procedimientos recomendados son:

  • Si se utiliza memoria de servidor mínima, es mejor asignar únicamente la cantidad de memoria que se necesita para que haya memoria suficiente para otros procesos (evitando de esta forma la paginación).
  • No establecer un valor demasiado alto de asignación previa de memoria. De lo contrario, puede que otros procesos no obtengan memoria suficiente cuando la necesiten, y esto puede producir paginación de memoria.

Si sigue los procedimientos anteriores para una base de datos con tablas optimizadas para memoria, el intento de restaurar y recuperar una base de datos podría dar lugar a que esta pasara a un estado "Pendiente de recuperación", incluso si hay memoria suficiente para recuperarla. El motivo es que, al iniciarse, OLTP en memoria pone los datos en memoria de forma mucho más dinámica que la forma en que la asignación de memoria dinámica asigna la memoria necesaria a la base de datos.

Resolución

Para mitigar este problema, asigne previamente memoria suficiente a la base de datos para recuperar o reiniciar la base de datos; no especifique un valor mínimo confiando en que la memoria dinámica proporcionará memoria adicional cuando sea necesario.

Consulte también

Administrar memoria para OLTP en memoria
Supervisar y solucionar problemas del uso de la memoria
Enlazar una base de datos con tablas con optimización para memoria a un grupo de recursos de servidor
Guía de arquitectura de administración de memoria
Opciones de configuración de memoria del servidor