¿Estás utilizando In-Memory OLTP en SQL Server 2014 y notas que los objetos In-Memory están consumiendo más memoria de la esperada? En este artículo, exploraremos cómo optimizar el uso de memoria para In-Memory OLTP en SQL Server.
Cuando se utiliza In-Memory OLTP, es importante entender que tanto el motor In-Memory como el motor tradicional de SQL Server comparten los mismos recursos. Esto significa que hay un límite en la cantidad de memoria disponible para ambos motores. Para gestionar el uso de memoria, SQL Server proporciona opciones de configuración como “Max Server Memory (MB)” y “Min Server Memory (MB)”. Estas opciones te permiten establecer un límite estricto en el consumo de memoria de la instancia y definir una línea base de memoria que SQL Server no cederá al sistema operativo en caso de presión de memoria.
En SQL Server 2014, puedes optimizar aún más el uso de memoria para In-Memory OLTP creando grupos de recursos y vinculando bases de datos con objetos Memory-Optimized a estos grupos. SQL Server establece un límite en el consumo de memoria de los objetos In-Memory en función de los recursos disponibles en el grupo de recursos subyacente. Incluso si creas un grupo dedicado para objetos Memory-Optimized, SQL Server establecerá un umbral para el uso de memoria de acuerdo con la memoria comprometida objetivo de la instancia.
Aquí tienes una tabla que muestra el porcentaje de memoria que puedes utilizar para objetos Memory-Optimized en función de la memoria asignada a un grupo específico:
| Memoria Objetivo del Grupo | % Disponible para Objetos In-Memory |
|---|---|
| <= 8 GB | 70% |
| <= 16 GB | 75% |
| <= 32 GB | 80% |
| <= 96 GB | 85% |
| > 96 GB | 90% |
Para calcular la memoria máxima disponible para objetos In-Memory en un grupo específico, puedes utilizar la siguiente consulta:
WITH cte AS (
SELECT RP.pool_id,
RP.Name,
RP.min_memory_percent,
RP.max_memory_percent,
CAST(RP.max_memory_kb / 1024. / 1024. AS NUMERIC(12, 2)) AS max_memory_gb,
CAST(RP.used_memory_kb / 1024. / 1024. AS NUMERIC(12, 2)) AS used_memory_gb,
CAST(RP.target_memory_kb / 1024. / 1024. AS NUMERIC(12, 2)) AS target_memory_gb,
CAST(SI.committed_target_kb / 1024. / 1024. AS NUMERIC(12, 2)) AS committed_target_kb
FROM sys.dm_resource_governor_resource_pools RP
CROSS JOIN sys.dm_os_sys_info SI
)
SELECT c.pool_id,
c.Name,
c.min_memory_percent,
c.max_memory_percent,
c.max_memory_gb,
c.used_memory_gb,
c.target_memory_gb,
CAST(c.committed_target_kb *
CASE
WHEN c.committed_target_kb <= 8 THEN 0.7
WHEN c.committed_target_kb < 16 THEN 0.75
WHEN c.committed_target_kb < 32 THEN 0.8
WHEN c.committed_target_kb <= 96 THEN 0.85
WHEN c.committed_target_kb > 96 THEN 0.9
END * c.max_memory_percent / 100 AS NUMERIC(12, 2)) AS [Max_for_InMemory_Objects_gb]
FROM cte c;Para optimizar el uso de memoria para In-Memory OLTP, puedes crear un grupo de recursos y vincular tu base de datos con objetos Memory-Optimized a este grupo. Aquí tienes un ejemplo:
CREATE RESOURCE POOL [InMemoryObjects] WITH (MIN_MEMORY_PERCENT = 50, MAX_MEMORY_PERCENT = 50);
ALTER RESOURCE GOVERNOR RECONFIGURE;
EXEC sp_xtp_bind_db_resource_pool 'SampleDB', 'InMemoryObjects';Recuerda poner tu base de datos fuera de línea y luego en línea nuevamente para que el vínculo surta efecto:
ALTER DATABASE SampleDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
ALTER DATABASE SampleDB SET ONLINE;Si necesitas cambiar la reserva de memoria para objetos Memory-Optimized, puedes reconfigurar fácilmente los límites de memoria mediante la alteración de la configuración del grupo de recursos o cambiando el parámetro del servidor “Max Server Memory (MB)”. Aquí tienes ejemplos:
ALTER RESOURCE POOL [InMemoryObjects] WITH (MIN_MEMORY_PERCENT = 65, MAX_MEMORY_PERCENT = 65);
ALTER RESOURCE GOVERNOR RECONFIGURE;
EXEC sys.sp_configure 'max server memory (MB)', 10240;
RECONFIGURE WITH OVERRIDE;Para desvincular una base de datos de un grupo de recursos, puedes utilizar el siguiente comando:
EXEC sp_xtp_unbind_db_resource_pool 'SampleDB';Recuerda poner tu base de datos fuera de línea y luego en línea nuevamente para que la desvinculación surta efecto:
ALTER DATABASE SampleDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
ALTER DATABASE SampleDB SET ONLINE;Al optimizar el uso de memoria para In-Memory OLTP en SQL Server, puedes asegurar una utilización eficiente de los recursos y mejorar el rendimiento de tus aplicaciones. Aprovecha los grupos de recursos y las opciones de configuración disponibles en SQL Server para ajustar la asignación de memoria para tus objetos Memory-Optimized.