Puede no haber suficiente memoria virtual cuando haya un gran número de bases de datos en SQL Server

Síntomas

Puede no haber suficiente espacio de direcciones virtuales disponibles en el proceso de Microsoft SQL Server si se cumplen todas las condiciones siguientes cuando se ejecuta SQL Server con el valor predeterminado los valores de configuración:
  • El servidor tiene 2 GB o más de RAM.
  • Hay un gran número de bases de datos del sistema (por ejemplo, más de 500).
  • Se actualiza la mayoría de las bases de datos (por ejemplo, las bases de datos no tiene un estado de "sólo lectura").
  • Hay suficientes conexiones de usuario activas simultáneamente para utilizar la mayoría de los 255 subprocesos de trabajo de SQL Server.
SQL Server puede generar los siguientes mensajes de error después de que se agote el espacio de direcciones virtual de 2 GB todo (o después de que el espacio de dirección virtual de 3 GB todo se utiliza en SQL Server Enterprise Edition con el modificador/3 GB en el archivo Boot.ini).

Mensaje 1

Error: 17802, gravedad: 18, estado: 3
No se pudo crear el subproceso de evento de servidor.

Mensaje 2

SQL Server no pudo crear el subproceso process_loginread.

Mensaje 3

Advertencia: Al desactivar la caché de procedimientos para dejar libre memoria contigua.


Búfer distribución: Robado = 3454 libre = 2540 procedimientos = 138
Inram=0 Dirty=1108 Kept=35
I/O=0, Latched=0, Other=214821
Recuentos de búfer: Confirmada = 222096 Target = 222096 hash = 215964
InternalReservation = ExternalReservation 547 = 0 Min libre = 512
Caché de procedimientos: TotalProcs = 8 TotalPages = 138 InUsePages = 138
Administrador de memoria dinámica: robado = 3556
OS=497 General=1706
Plan de consulta = optimizador 755 = 0
Utilities=9 Connection=1583
Objetos de memoria global: Recursos = 1119 bloqueos = 163 XDES = 1 SQLCache = 90 replicación = 5 LockBytes = ServerGlobal 2 = 20
Administrador de memoria de consulta: concede = en espera 0 = 0 máximo = 164370 disponibles = 164370

Causa

Para cada base de datos actualizada, SQL Server asigna al menos un bloque de 64 KB para el uso en formato de registros antes de que se escriban en disco. Esta asignación se produce cuando se genera la primera entrada del registro para la base de datos, como durante una instrucción INSERT, UPDATE o DELETE. Dependiendo de la actividad y el tamaño de los registros generados, las modificaciones subsiguientes pueden desencadenar la asignación de asignaciones adicionales de 64 KB. SQL Server 7.0 asignará no más de tres bloques de 54 KB. En SQL Server 2000, el número superior de asignaciones para cada base de datos es una función del número de procesadores que SQL Server está configurado para utilizar.

Solución alternativa

Utilice el parámetro de inicio -g para dejar adicional, sin reservar memoria virtual disponible para estas asignaciones de la base de datos. El parámetro -g se documenta en el archivo Readme.txt del service pack de SQL Server 7.0 y en los libros en pantalla de SQL Server 2000. La sección "Más información" de este artículo incluye la configuración que Microsoft recomienda que utilizar para determinar el valor apropiado para esta configuración.

Más información

En un equipo con 2 GB o más de RAM, SQL Server reserva todos pero 256 MB (SQL Server 7.0) o 384 MB (SQL Server 2000) de espacio de dirección virtual durante el proceso de inicio para su uso por el grupo de búferes. Además, para almacenar el caché de procedimiento y de datos, SQL Server utiliza la memoria búfer para atender más otras peticiones de memoria de procesos de SQL Server que son menos de 8 KB. La memoria restante no reserva está pensada para su uso con otras asignaciones que no puede ser atendida desde el grupo de búferes. Estas asignaciones se incluyen, pero no se limitan a:
  • Pilas y el bloque de entorno del subproceso asociado para todos los subprocesos que crea SQL Server. Después de que SQL Server crea todos los subprocesos de trabajo 255, esto es aproximadamente 140 MB.
  • Las asignaciones que se realizan por otros archivos DLL o procesos que se ejecutan en el espacio de direcciones de SQL Server (que varía de un sistema a otro), como:
    • Proveedores de OLE DB desde los servidores vinculados.
    • Los objetos COM que se cargan mediante el uso del sistema sp_OA procedimientos almacenan o procedimientos almacenados extendidos.
  • Procedimientos almacenados de cualquier imagen (.exe o .dll) que se carga en el espacio de direcciones, que suele utiliza 20 a 25 MB, pero posiblemente más si utiliza servidores vinculados, sp_OA, ni ampliarse.
  • El montón del proceso y todos los montones que SQL Server puede crear. Durante el proceso de inicio, normalmente es de 10 MB, pero puede ser más si utiliza servidores vinculados, sp_OAo procedimientos almacenados extendidos.
  • Asignaciones de procesos de SQL Server que son mayores que 8 KB, tales como los necesarios para los planes de consultas grandes, envían y reciban búferes si la opción de configuración tamaño del paquete de red es cerca de 8 KB y así sucesivamente. Para ver este número, busque el valor Reservado del sistema operativo que se notifica en DBCC MEMORYSTATUS y que aparece como número de páginas de 8 KB. Los valores típicos para esto son de 5 MB.
  • Una matriz para registrar la información de estado para cada búfer que está en el grupo de búferes. Es normalmente unos 20 MB, a menos que SQL Server se está ejecutando con Address Windowing Extensions (AWE) habilitado, en cuyo caso puede ser significativamente mayor.
En sistemas que tienen un gran número de bases de datos, las asignaciones de 64 KB que son necesarias para el formato de registro pueden ocupar toda la memoria virtual restante. En ese momento, pueden fallar asignaciones posteriores, resultando en uno o varios de los errores que se enumeran en la sección "Síntomas" de este artículo.

Mediante el parámetro de inicio -g , puede indicar a SQL Server para dejar más memoria virtual disponible para que la combinación de estas asignaciones relacionadas con el registro y otras asignaciones normales no se quede sin espacio de direcciones virtuales.

La tabla siguiente enumeran algunos puntos de partida sugeridos para el valor de g - dependiendo del número de bases de datos y la versión del servidor:
Bases de datosSQL Server 7.0SQL Server 2000
250-g134N/A
500-g185N/A
750-g237N/A
1000-g288-g288
1250-g340-g340
1500-g392-g392
Esta tabla se calculó utilizando los valores típicos que aparecen y también se basa en el supuesto de que no hay actividad del servidor vinculado, sp_OA o procedimientos almacenados extendidos que están en uso. También se basa en el supuesto de que no utiliza AWE y ese analizador de SQL no está en uso. Cualquiera de estas condiciones pueden requerir que aumentar el valor de -g.

Microsoft recomienda que se tome consideración seria antes de ejecutar un servidor con más bases de datos que ésta debido a la sobrecarga que se requiere para tener este número de bases de datos en el sistema está ocupando mucha memoria virtual el búfer, lo que puede ocasionar un rendimiento deficiente del sistema como un todo.

Además, la creación de lotes de bases de datos tiene el efecto más significativo en la memoria virtual. También hay asignaciones de memoria de cada base de datos que pueden causar una condición de la memoria de grupo de búfer. Por ejemplo, puede recibir el siguiente mensaje de error:
Error: 701, gravedad: 17, estado: 123.

No hay memoria de sistema insuficiente para ejecutar esta consulta.
Este tipo de condición de falta de memoria puede ser más común en SQL Server 2005 como SQL Server 2005 realiza un seguimiento de los metadatos de cada base de datos más que las versiones anteriores de SQL Server.

Cuando se realiza el seguimiento del uso del índice mediante el procedimiento sys.dm_db_index_usage_stats almacenado, la operación puede requerir una cantidad importante de memoria. La operación requiere una cantidad importante de memoria si cada base de datos tiene gran cantidad de índices.
Propiedades

Id. de artículo: 316749 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios