Optimizando SQL Server con Lock Pages in Memory (LPIM)

El bloqueo de páginas de memoria (LPIM) nos permitirá controlar lo que pasa cuando el SO tiene presión de RAM y tiene que paginar a disco.

Continuamos con la serie de artículos sobre la optimización de la RAM de nuestro SQL Server que empezamos ayer. Hoy vamos a hablar de una característica muy interesante de SQL Server que puede ayudar a mejorar el rendimiento de nuestras bases de datos: el bloqueo de páginas de memoria o Lock Pages in Memory (LPIM). No es una característica de SQL Server sino una configuración de Windows Server que nos permitirá controlar lo que pasa cuando el sistema tiene presión de RAM y tiene que paginar a disco.

¿Qué es Lock Pages in Memory?

El bloqueo de páginas en memoria (LPIM) es una política de Windows que evita que el sistema realice la paginación de los datos a la memoria virtual del disco durante la presión de memoria. En otras palabras, LPIM bloquea los datos en la memoria RAM. No importa que otros procesos o el propio sistema operativo necesiten esa memoria, nuestro SQL va a decir “tu problema no es mi problema” y no las va a liberar. Esto puede mejorar el rendimiento del sistema y puede ser muy útil para SQL Server aunque también es muy peligroso.

¿Cómo funciona LPIM en SQL Server?

Cuando SQL Server se ejecuta en una cuenta que tiene el privilegio LPIM, puede bloquear las páginas de memoria en la RAM física y evitar que el sistema operativo las pagine a la memoria virtual en el disco duro. Esto significa que SQL Server usará la memoria tanto como sea necesario, y no la liberará al sistema operativo en circunstancias normales. Este comportamiento puede aumentar el rendimiento del sistema y de SQL Server si hay presión de memoria en el sistema.

¿Cómo habilitar LPIM en SQL Server?

Como hemos comentado, para habilitar LPIM en SQL Server, debemos conceder el privilegio a la cuenta de servicio de SQL Server. Para hacerlo debemos seguir los siguientes pasos:

  1. En el menú Inicio, seleccionamos Ejecutar.
  2. En el cuadro Abrir, escribimos gpedit.msc.
  3. En la consola Directiva de grupo local, expandimos Configuración del equipo.
  4. Expandimos Configuración de Windows.
  5. Expandimos Configuración de seguridad.
  6. Expandimos Directivas locales.
  7. Seleccionamos la carpeta Asignación de derechos de usuario.
  8. En el panel, vamos a la directiva Bloquear páginas en la memoria y hacemos doble clic en ella.
  9. En el cuadro de diálogo Configuración de la directiva de seguridad local, seleccionamos **Agregar usuario o grupo…*.
  10. Agregamos la cuenta de servicio de SQL Server.
  11. Seleccionamos Aceptar.
  12. Reiniciamos la instancia SQL Server para que se aplique la configuración.

Ventajas y desventajas de LPIM

Según lo que hemos visto en la teoría, con LPIM mejoraremos el rendimiento al evitar que las páginas se muevan entre RAM y disco, reducimos la latencia. Además ganamos estabilidad al asignar memoria física específicamente para SQL Server, evitando conflictos con otros procesos o aplicaciones. Por último, ganamos un mayor control sobre cómo se utiliza la memoria en nuestra instancia. 

Sin embargo, estamos hablando de una configuración a bastante bajo nivel que interfiere en la gestión de memoria del sistema operativo. Cualquier mala decisión por nuestra parte podría acarrear resultados no deseados. En este sentido, es importante tener en cuenta que si se concede el privilegio LPIM, se recomienda encarecidamente establecer la memoria máxima de SQL Server en un valor específico, en lugar de dejar el valor predeterminado de 2 PB. Esto se debe a que si el valor de Memoria de servidor máxima se establece en una cifra demasiado alta, puede hacer que una única la instancia de SQL Server compita por la memoria con otras instancias de SQL Server hospedadas en el mismo host, otras aplicaciones o incluso con el propio sistema operativo.

¿Cuándo habilitar LPIM?

Llegamos a un punto clave, internet está dividido sobre este tema. Incluso la propia documentación oficial de Microsoft parece recomendarlo en algunos apartados y desaconsejarlo en otras páginas. Así que, aquí está SoyDBA para intentar aclarar las dudas. A priori, parece que ante un escenario de presión de memoria podría ser recomendable activar esta característica. Si a menudo nos encontramos con escenarios en los que SQL Server sufre de problemas de memoria y vemos el típico error 17890  en el log deberíamos por lo menos plantearnos esta solución. Quizá soy yo muy conservador pero, personalmente, no creo que sea recomendable en ningún otro escenario. Si no es para solucionar un problema no metería mano en configuraciones de este calado en el sistema operativo. Y por supuesto, nunca lo pondría en producción sin una buena batería de pruebas en un entorno para ese fin. En resumen, yo no lo haría si no hay un problema, y si lo hay sólo activaría LPIM si no puedo aumentar el hardware de la máquina que sería el segundo paso (el primero es tratar de reducir el consumo, obviamente).

LPIM en máquinas virtuales

No quería cerrar este artículo sin comentar un pequeño detalle y es que esta configuración no deberíamos tocarla en servidores virtuales. Todos los principales proveedores de máquinas virtuales tienen su propia gestión de la memoria de las máquinas virtuales y configurar LPIM en una máquina virtual nos va a causar problemas graves de rendimiento, tanto de nuestro propio servidor como en el resto de máquinas alojadas en el mismo host e, incluso, en el propio sistema del host.

Conclusión

LPIM puede ser una herramienta valiosa para mejorar el rendimiento de SQL Server. Sin embargo, como con cualquier herramienta, es importante entender cómo funciona y cómo usarla correctamente para obtener los mejores resultados. Me vienen a la cabeza aquellas sabias palabras “Un gran poder conlleva una gran responsabilidad” y es que, en este contexto, tienen incluso más sentido que cuando el Tio Ben (a punto de morir) se las dijo a Spiderman.

Espero que este artículo te haya resultado útil e interesante. Si tienes alguna duda o comentario, no dudes en contactarnos en Twitter o por mail o dejarnos un mensaje en los comentarios de aquí abajo. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir.

Publicado por Roberto Carrancio

Mi nombre es Roberto Carrancio y soy un DBA de SQL server con más de 10 años de experiencia en el sector. Soy el creador del blog soydba.es donde intento publicar varios artículos a la semana (de lunes a viernes que los fines de semana me gusta estar con mi gente y disfrutar de mi moto) Espero que disfrutes leyendo este blog tanto como yo disfruto escribiendo y que te sea de utilidad. Si tienes alguna sugerencia, pregunta o comentario, puedes dejarlo al final de cada entrada o enviarme un correo electrónico. Estaré encantado de leerte y responderte. ¡Gracias por tu visita! Mi principal interés es compartir mi conocimiento sobre bases de datos con todo el que quiera aprenderlo. Me parece un mundo tan apasionante como desconocido. Fuera de lo profesional me encanta la cocina, la moto y disfrutar de tomar una cervecita con amigos.

Deja una respuesta