SQL Server 2005: no hay suficiente memoria del sistema para ejecutar esta consulta

13

Uno de nuestros servidores SQL, que ha estado funcionando estable durante bastante tiempo (años), recientemente ha estado arrojando errores de memoria insuficientes. Desde el registro de eventos de la aplicación, vemos:

Id. De evento: 701

Descripción: no hay suficiente memoria del sistema para ejecutar esta consulta.

Nuestro equipo que administra este servidor está compuesto principalmente por desarrolladores que duplican las tareas del administrador de sistemas. Sin embargo, nuestra experiencia principal es el desarrollo. Dicho esto, no sabemos cómo hacemos para solucionar este problema. Hemos estado buscando foros y otras cosas y no hemos encontrado nada que coincida

Entonces, aquí hay algunos detalles más para ayudar en la resolución de problemas:

  • Nuestra memoria mínima del servidor está establecida en 0.
  • Nuestra memoria máxima del servidor está configurada en 2000.
  • La memoria física total es de 3,325.85 MB (de sysinfo).
  • La memoria virtual total es de 7,10 GB (de sysinfo).
  • No estábamos usando AWE para asignar memoria, pero ahora estamos para ver si hace la diferencia.
  • Este error fue generado por un trabajo que estaba haciendo una copia de seguridad de un registro de transacciones, no ejecutaba una consulta.
  • Tenemos muchos servidores vinculados. Los tipos de RDBMS en el otro lado son SQL Server (2005 y 2000), Oracle 10g y sistemas OSI PI.
  • Es intermitente en este punto. Parece que no podemos correlacionar ningún momento o evento con los errores.
  • Por supuesto, reiniciar parece hacer que desaparezca por un tiempo, lo que tiene sentido debido a la naturaleza del mensaje de error.
  • Este servidor se triplica como un servidor de aplicaciones (un par de servicios de Windows) y un servidor web, así como el servidor de base de datos.

EDITAR:

Estamos en SP3. La mayoría de las publicaciones que encontramos fueron anteriores al SP1, lo que no se aplica a nosotros.

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

devoluciones

9.00.4035.00 SP3 Edición estándar

Aaron Daniels
fuente
¿Puede revisar el registro de errores de SQL Server ya que puede haber detalles adicionales con respecto a este error?
John Sansom

Respuestas:

4

Sugeriría usar el parámetro de inicio -g también. Parece funcionar para la mayoría de las personas y probablemente también funcione para usted. Mi única preocupación sería que el problema subyacente no se resuelva. Por ejemplo, si hay una pérdida de memoria debido a un servidor vinculado, y el MTL se incrementa a 512 Mb, ¿será solo un período más largo entre problemas de memoria? No sé la respuesta a eso, pero tiendo a estar de acuerdo con UndertheFold en que un perfmon puede ser un buen comienzo.

Mike Thien
fuente
7

El mensaje de error "No hay suficiente memoria del sistema para ejecutar esta consulta". se refiere al espacio de direcciones virtuales (VAS) que no está disponible y no a la memoria en sentido convencional, es decir, dentro del espacio de proceso de SQL Server.

Dado que solo está ejecutando con 3GB en este servidor y SQL Server ha asignado hasta 2 GB, esto significa que el sistema operativo y, lo que es más importante, cualquier otra cosa en la caja tiene menos de 1 GB para jugar. Eso no es mucha memoria.

Si este problema es realmente el resultado de una pérdida de memoria, entonces se está consumiendo el VAS fuera del espacio de proceso de SQL Server (memToLeave).

Sugeriría usar el parámetro de inicio -g para asignar más memoria a la porción memToLeave.

Consulte el siguiente artículo para obtener más información:

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

También es posible que desee reducir la configuración de memoria máxima de SQL Server, pero lo haría como último recurso.

John Sansom
fuente
Buen artículo. ¡Gracias por crearlo también! Tenemos varios dominios de descarga de aplicaciones en nuestros registros SQL. Solo tenemos 2 procedimientos almacenados CLR, y básicamente solo obtienen y colocan datos en / desde un servicio web. Parece extraño que estos 2 procedimientos almacenados CLR estarían usando demasiados VAS listos para usar.
Aaron Daniels
De nada. Como ya sabrá, la asignación predeterminada para memToLeave es de solo 256 MB. Esta es una caja de arena bastante pequeña para sus AppDomains, todos los códigos CLR / administrados, consultas del servidor vinculado, SSIS, etc. especialmente si está utilizando toda la memoria disponible en el servidor. Sugeriría duplicarlo a 512 MB usando el parámetro de inicio -g.
John Sansom
1

Esto podría estar relacionado con una pérdida de memoria de un controlador de servidor vinculado, de acuerdo con este hilo del foro :

Lo siguiente es lo que nos dijo Microsoft.

Aparentemente, el procesamiento de datos utilizando un servidor vinculado, específicamente el controlador Fox Pro, causa una pérdida de memoria que se acumula con el tiempo.

splattne
fuente
0

Este servidor se triplica como un servidor de aplicaciones (un par de servicios de Windows) y un servidor web, así como el servidor de base de datos.

Establecería su memoria mínima: es muy posible que estos otros procesos "roben" memoria de SQL

Puede ejecutar un registro de contador utilizando perfmon para confirmar esto y / o darse más información para identificar cuál es el problema real.

CPU_BUSY
fuente
0

¡Referencia tomada de este blog!

Existen diferentes alternativas para resolver este problema.

Primero, verifique la configuración de su servidor SQL para "memoria mínima del servidor" y "memoria máxima del servidor". Si encuentra una diferencia muy pequeña en ambos valores, aumente la "memoria máxima del servidor".

Segundo, descubrió consultas de larga duración con su información de uso de memoria y si esta consulta está en estado inactivo, verifique y elimine este proceso. La optimización del rendimiento de la base de datos es importante para los usos de la memoria.

En tercer lugar, descubrió los usos del índice para consultas de larga duración porque sin una indexación adecuada su sistema DISK I / O aumenta y afecta directamente a su memoria.

Cuarto, verifique el tamaño del archivo de paginación de memoria virtual y aumente el tamaño de este archivo.

Quinto, compruebe el tamaño de la "memoria mínima por consulta", en realidad es de 1024 KB por defecto, pero en situaciones excepcionales puede disminuir el tamaño de este parámetro. En realidad, esto no es aconsejable, pero puedes probarlo.

Sexto, intente ejecutar este comando DBCC y nuevamente esto no es aconsejable porque puede afectar el rendimiento general del servidor. Pero puedes probar esto.

Anvesh
fuente