He estado teniendo errores periódicos de OOM de SQL Server, una vez hasta el punto de que SQL Server se cerró y siempre sucedió durante la noche, cuando nadie lo está usando, y ningún trabajo del Agente SQL se ejecuta en ese momento:
Aquí está el error típico:
17/08/2017 19: 31: 17, spid100, Desconocido, No hay suficiente memoria del sistema en el grupo de recursos 'interno' para ejecutar esta consulta.
17/08/2017 19: 31: 17, spid100, Desconocido, Error: 701 Gravedad: 17 Estado: 123.
17/08/2017 19: 31: 17, spid112, Desconocido, Error: 18056 Gravedad: 20 Estado: 29. (Parámetros :). El error se imprime en modo breve porque hubo un error durante el formateo. Se omiten las notificaciones de seguimiento de ETW, etc.
Aquí está la información del servidor:
- 10 GB de memoria mínima del servidor SQL
- 21 GB de memoria máxima del servidor SQL
- solo 4 DB en el servidor
- sus tamaños son solo de 1 a 2 GB cada uno
- El tamaño de Tempdb nunca aumentó a más de 1 GB (configurado para crecer automáticamente a 10 GB)
- Todos los índices son bajos, estadísticas actualizadas
Versión:
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Oct 20 2015 15:36:27 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
Verifiqué varios elementos:
- DBCC memorystatus
Estadísticas rápidas:
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB] FROM sys.dm_os_process_memory; GO Output: 20 GB Page Life Expectancy 155932
Ningún gobernador de recursos habilitado:
select pool_id, cache_memory_kb, used_memory_kb, out_of_memory_count,used_memgrant_kb from sys.dm_resource_governor_resource_pools Output: pool_id | cache_memory_kb | used_memory_kb | out_of_memory_count | used_memgrant_kb --------+-----------------+----------------+---------------------+----------------- 1 | 295368 | 641416 | 0 | 0 select (physical_memory_in_use_kb/1024) Memory_usedby_Sqlserver_MB, (locked_page_allocations_kb/1024) Locked_pages_used_Sqlserver_MB, (total_virtual_address_space_kb/1024 )Total_VAS_in_MB, process_physical_memory_low, process_virtual_memory_low from sys. dm_os_process_memory Output: Memory_usedby_Sqlserver_MB | Locked_pages_used_Sqlserver_MB | Total_VAS_in_MB | process_physical_memory_low | process_virtual_memory_low ---------------------------------------------------------------------------------------------------------------------------------------- 20553 | 20393 | 134217727 | 0 | 0
El servidor está en SP3, sé que hubo un problema de pérdida de memoria en SP1, por lo que descarto eso.
¿Alguien nota algo en el resultado de DBCC en el que debería centrarme?
fuente
Respuestas:
Dado que SQL Server se ejecuta en una VM, como lo indica el
(hypervisor)
indicador en la declaración de versión, debe asegurarse de que tenga una reserva de memoria en VMWare (o Hyper-V, etc.) en el servidor host.La reserva de memoria normalmente debe ser el 100% de la memoria asignada a la VM para máquinas virtuales de SQL Server que se utilizan en un entorno de producción. Sin una reserva de memoria, el servidor host puede "robar" memoria de la máquina virtual mediante el uso de un "controlador de globo" para que lo use otra máquina virtual, lo que probablemente sea la causa de su condición de falta de memoria.
En VMWare vCenter, para configurar la reserva de memoria en una máquina virtual:
Apague la máquina virtual antes de configurar los ajustes de memoria.
En vSphere Client, haga clic con el botón derecho en una máquina virtual del inventario y seleccione Editar configuración.
En la ventana Propiedades de la máquina virtual, seleccione la pestaña Recursos y seleccione Memoria.
En el panel Asignación de recursos, seleccione la casilla de verificación Reservar toda la memoria del invitado (Todo bloqueado).
Haga clic en Aceptar.
Si está utilizando Microsoft Hyper-V, deshabilite la memoria dinámica para la VM, utilizando este proceso en el Administrador de Hyper-V:
fuente
Par de cambios de configuración que haría:
Puede usar el siguiente script para lograr esto:
fuente