Procedo a explicarte las posibilidades para reducir el consumo de SQL.
En SQL Server se pueden diferenciar dos grandes secciones de memoria.
- Memoria para paginas (Datos)
- Memoria del proceso de SQL
Sobre la memoria de proceso de SQL no tenemos control ninguno y SQL va a consumir la que crea necesaria (Normalmente en torno a 200M-300M) dependerá de servidores enlazados, proveedores de acceso, etcétera
Sobre la memoria de páginas tenemos más flexibilidad, podemos controlar su tamaño máximo “max server memory” tamaño minimo “min server memory” e incluso podemos habilitar una opción “lock pages in memory” que hace que las páginas de datos no puedan ser eliminadas por otros procesos del sistema
En este artículo tenemos información sobre “max server memory” y “min server memory”
http://msdn.microsoft.com/en-us/library/ms178067.aspx
Para configurar “max server memory” ejecutaremos:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 3071;
GO
RECONFIGURE;
GO
Cambiamos el valor 3071 (valor en megas) por el que nos sea más conveniente.
Inicialmente al cambiar este valor el servidor debería ir liberando la memoria según le es posible hasta llegar hasta el valor establecido, esto puede llegar a tardar bastante, días incluso, según mi experiencia. Si se necesita liberar memoria de forma inmediata lo más rápido es cambiar este valor y reiniciar el servicio de SQL.
Otros conceptos de la memoria de páginas:
Hay una diferencia fundamental entre las versiones de 32 bits y 64 bits de SQL Server.
En 32bits Windows divide el espacio de memoria(4GB) en dos bloques de 2GB, 2GB para el Kernel y 2GB para el proceso, por tanto sin ninguna opción avanzada más SQL Solo va a consumir 2GB de máximo (paginas + proceso)
En 64bits Windows divide rl espacio de memoria(16TB) en dos bloques de 8TB, 8TB para el Kernel y 8TB para el proceso por tanto en 64bits SQL va a consumir toda la memoria con la que esté configurado en “max server memory” + memoria para el proceso de SQL.
32 bits y más de 2GB para la memoria de páginas.
En las ediciones de 32bits existe la opción de usar más de 2GB, esta memoria extra solo se puede usar para páginas de memoria, el uso de esta memoria está apoyado en una API de Windows llamada AWE. Si AWE está activo SQL 32bits será capaz de usar tanta RAM para páginas como la especificada en “max server memory”
Más información sobre AWE: http://msdn.microsoft.com/es-es/library/ms190673(v=SQL.105).aspx
64bits y lock pages in memory.
En ediciones de 64 bits existe la posibilidad de habilitar “lock pages in memory” lo que provocara que el sistema operativo no pueda reclamar RAM a sql server en caso de necesitarlo, se recomienda ser prudente con esta opción, mientras que en Windows 2003 puede ser beneficioso esta opción en Windows 2008 no se considera tan necesario, de todas formas la activación de esta opción dependerá del entorno y uso de la base de datos.
Más información: http://msdn.microsoft.com/es-es/library/ms190730.aspx
Tanto AWE como “lock pages in memory” hacen que el sistema operativo no pueda reclamar esa memoria para otros procesos.
Al problema: Reducir la memoria consumida por SQL Server sin parada del servicio.
Como he comentado esto se consigue con la variable “max server memory”
En caso de no tener AWE/lock pages in memory activo.
- En este caso una vez configurada la variable “max server memory” con los pasos especificados SQL debería liberar la memoria ya sea cuando no la necesita o si Windows le obliga a liberarla para ser usada por otro proceso. Hay que tener en cuenta que si Windows le reclama mucha memoria de golpe a SQL Server veremos una bajada de rendimiento en SQL Server mientras salva los datos de las páginas al ser liberadas.
- En caso de tener AWE/lock pages in memory en principio no debería haber mayor diferencia que con AWE/lock pages in memory activado SQL va a ir liberándola progresivamente, pero al estar las paginas bloqueadas en memoria Windows no puede reclamarle memoria a SQL Server por tanto es factible que algunos programas que necesiten gran cantidad de RAM no funcionen correctamente.
Conclusión después de este rollo: En cualquier situación si se quiere no reiniciar la instancia se puede reconfigurar “max server memory” y a lo largo de 1-2 días ver el progreso de la memoria de SQL Server. Si se necesita liberar la memoria de forma inmediata hay que reiniciar la instancia.
Fuentes:
Microsoft, MSDN
Apunte y recopilación por Norman M. Pardell
Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.