En esta entrada vamos a ver que recomendaciones tenemos para configurar la memoria:
¿Que es eso de ‘max server memory’?
La eterna pregunta de ¿cuánta memoria doy a mi servidor?
¿Que problemas pueden surgir si tengo poca memoria?
Empecemos por la primera pregunta:
‘max server memory’ es una de las configuraciones avanzadas de memoria que tiene SQL Server, esta opción limita el tamaño máximo que puede tener el Buffer Pool (Cache usada para las páginas de las bases de datos).
Las recomendaciones sobre el valor que debemos tener en este parámetro se pueden encontrar aquí:
http://msdn.microsoft.com/en-us/library/ms178067.aspx Por defecto SQL maneja su propia memoria, en la mayoría de los casos que SQL Server es el único proceso que requiere grandes cantidades de memoria no es ningún problema. Pero si tenemos otras tareas que sean grandes consumidoras, por ejemplo más de una instancia de SQL Server, o un trabajo de SSIS que trabaje con gran cantidad de datos entonces es cuando pueden surgir los problemas.
Lock Pages in Memory es una función que nos proporciona Windows para que una aplicación pueda bloquear memoria física y esta no sea paginada. Esto le viene muy bien a SQL Server, evidentemente por temas de seguridad ningún proceso puede hacer uso de esta característica si no tiene los permisos necesarios, para que SQL Server haga uso simplemente tenemos que darle los permisos y reiniciar la instancia. Nunca habilitar Lock Pages in Memory sin antes haber establecido un valor para “max server memory”
http://msdn.microsoft.com/en-us/library/ms190730.aspx
Las recomendaciones generales son las siguientes:
Por que recomendamos lock pages in memory para Windows 2003
Windows 2003 tiene un algoritmo de paginación muy agresivo y puede paginar una gran porción de la memoria de SQL Server afectando negativamente al rendimiento. ( http://support.microsoft.com/kb/918483 )
A continuación
El máximo consumidor de memoria en SQL Server es el buffer pool, por tanto deberemos dimensionar según la cantidad de datos que va a mover SQL Server, por ejemplo si nuestras bases de datos ocupan 10GB tener 20GB no va ayudar mucho más que tener 16 ya que prácticamente todos los datos van a residir en memoria. Para tomar la decisión de ampliar la memoria contamos principalmente con dos contadores de rendimiento dentro del grupo Buffer Manager (http://msdn.microsoft.com/en-us/library/aa173929(v=sql.80).aspx), a saber:
- Buffer Cache Hit Ratio: Porcentaje de páginas que han sido encontradas en memoria sin necesidad de acceder al disco. La recomendación es que este contador se mantenga en un 99%
- Page life expectancy: Número de segundos que una pagina está en el buffer sin que sea referenciada. Si este contador se mantiene por debajo de los 300 segundos deberemos pensar en aumentar la cantidad de RAM del sistema.
También es posible que debido a la falta de un índice tengamos estos valores bajos ya que en vez de hacer un “seek” sobre un índice hacemos un “scan” necesitando mas memoria para resolver la query, por tanto antes de ampliar RAM deberemos estudiar si optimizando nuestras queries podemos reducir el consumo de RAM.
y por último
El principal problema que veremos es un mayor acceso a los discos con la consiguiente perdida de rendimiento. Intermitentemente SQL Server imprime en el errorlog información de memoria si detecta que hay fallo de memoria, en casos extremos SQL puede dejar de responder generando volcados de memoria, generalmente de tipo Non-yielding IOCP Listener seguido de un mensaje relaccionado con la memoria como por ejemplo: “LazyWriter: warning, no free buffers found”
2012-08-13 09:18:32.62 Server **Dump thread - spid = 0, PSS = 0x0000000000000000, EC = 0x0000000000000000 2012-08-13 09:18:32.65 Server ***Stack Dump being sent to C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\SQLDump0001.txt 2012-08-13 09:18:32.65 Server * ******************************************************************************* 2012-08-13 09:18:32.65 Server * 2012-08-13 09:18:32.65 Server * BEGIN STACK DUMP: 2012-08-13 09:18:32.65 Server * 08/13/12 09:18:32 spid 0 2012-08-13 09:18:32.65 Server * 2012-08-13 09:18:32.65 Server * Non-yielding IOCP Listener 2012-08-13 09:18:32.65 Server * 2012-08-13 09:18:32.65 Server * ******************************************************************************* 2012-08-13 09:18:32.65 Server * ------------------------------------------------------------------------------- 2012-08-13 09:18:32.65 Server * Short Stack Dump 2012-08-13 09:18:32.92 Server Stack Signature for the dump is 0x0000000000000278 2012-08-13 09:18:47.46 spid2s LazyWriter: warning, no free buffers found.
Con esto termino este articulo, cuidado con asignar poca memoria al servidor!
Pablo Gavela López – Microsoft Customer Support Services