Problemas de falta de memoria en SQL Server 2012 SP3

8

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?

usuario132852
fuente
1
¿Hay otros servicios / aplicaciones alojados en este servidor? ¿Es la cuenta del Servicio SQL Server parte de la Política de seguridad local de páginas bloqueadas en la memoria? ¿Los registros de eventos de Windows indican algún otro problema durante el tiempo que experimentó el bloqueo de SQL Server?
John Eisbrener
-Ninguna otra aplicación alojada en este servidor, es un servidor SQL dedicado. -La cuenta de servicio del servidor SQL es parte del grupo de administradores de Windows. - Solo veo un montón de errores de VSS: error del servicio de instantáneas de volumen: error inesperado al consultar la interfaz IVssWriterCallback. hr = 0x80070005, acceso denegado. . Esto a menudo es causado por una configuración de seguridad incorrecta en el proceso de escritor o solicitante. Operación: recopilación de datos de escritor Contexto: Id. De clase de escritor: {35e81631-13e1-48db-97fc-d5bc721bb18a} Nombre del escritor: NPS VSS Writer ID de instancia de escritor: {...}
user132852
1
¿Es el servidor una máquina virtual? Si es así, ¿tiene recursos de memoria "dedicados" o los comparte con otras máquinas virtuales? Y, si comparte memoria, ¿se ha comprometido en exceso la distribución de los recursos de memoria? He visto que esto sucede (independientemente de la versión) en los servidores VM donde la memoria estaba sobreasignada.
SQL_Hacker
3
Gracias Shanky Solo para actualizar, encontré el problema el viernes pasado después de agregarlo a la supervisión, parece que una de las sesiones de supervisión de la aplicación en la aplicación (de terceros) no se configuró correctamente, la sesión de conexión no se cierra hasta horas después, cuando el OOM lo mata
user132852
1
@ user132852 podría poner su solución en una respuesta y marcarla como contestada.
Thomas Kronawitter

Respuestas:

2

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:

  1. Apague la máquina virtual antes de configurar los ajustes de memoria.

  2. En vSphere Client, haga clic con el botón derecho en una máquina virtual del inventario y seleccione Editar configuración.

  3. En la ventana Propiedades de la máquina virtual, seleccione la pestaña Recursos y seleccione Memoria.

  4. En el panel Asignación de recursos, seleccione la casilla de verificación Reservar toda la memoria del invitado (Todo bloqueado).

  5. 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:

  1. Asegúrese de que la VM esté apagada.
  2. Haga clic derecho en la VM, elija "Configuración"
  3. Seleccione "Memoria" en el panel izquierdo.
  4. Asegúrese de que "Habilitar memoria dinámica" no esté marcado.
  5. Inicie la VM.
Max Vernon
fuente
1

Par de cambios de configuración que haría:

  1. Elimine la configuración mínima de memoria, literalmente no hay necesidad de esto.
    • La razón por la que desea cambiar esto es porque si está configurado, SQL Server nunca liberará la memoria debajo de la marca. Si las páginas se bloquean en la memoria, la memoria ya no se puede paginar.
  2. Ajuste la memoria máxima del servidor al 75% del total para un total <32 gb o 87.5% para un total> 32 gb.
    • Suponiendo que SQL Server es lo único que se ejecuta en la máquina, deje que consuma la memoria restante después de otorgarle al SO suficiente memoria para funcionar correctamente.

Puede usar el siguiente script para lograr esto:

use master;
go

-- MIN Server Memory
exec sys.sp_configure
    'min server memory (MB)'
    ,0;

-- MAX Server Memory
declare
  @systemMemory int
  ,@maxServerMemory int;

select
  @systemMemory = total_physical_memory_kb / 1024
from
  sys.dm_os_sys_memory;

set @maxServerMemory = floor(@systemMemory * .75);

if @systemMemory >= 32768
  begin
    set @maxServerMemory = floor(@systemMemory * .875);
  end;

exec sys.sp_configure
  'max server memory (MB)'
  ,@maxServerMemory;

reconfigure;
go
pimbrouwers
fuente
3
Sé que estas son prácticas recomendadas bastante estándar, pero ¿puedes explicar un poco cómo cambiarlas ayudará con el error que están cometiendo?
Erik Darling