SQL Server: Como detectar problemas de rendimiento causados por falta de memoria

Hoy voy a explicaros un par de métodos que podéis utilizar para detectar problemas de rendimiento causados por falta de memoria en nuestros entornos.

Monitorizar rendimiento de la memoria utilizando vistas de SQL

SQL Server provee una serie de vistas las cuales nos ayudarán a identificar posibles problemas derivados de falta de memoria. Estas vistas son:

  • sys.dm_os_sys_info
  • sys.dm_os_sys_memory
  • sys.dm_os_process_memory

Para ejecutar estas vistas en primer lugar nos conectaremos a nuestro motor de SQL Server utilizando la herramienta SQL Manager Studio.

La primera vista (sys.dm_os_sys_info) nos proporcionará información de memoria a nivel de nuestro servidor físico:

SELECT physical_memory_kb, 
       virtual_memory_kb, 
       committed_kb, 
       committed_target_kb
FROM sys.dm_os_sys_info
  • physical_memory_kb: cantidad total de memoria física de nuestro servidor.
  • virtual_memory_kb: cantidad total de espacio de direcciones virtuales disponibles para el proceso en modo de usuario
  • commited_kb: memoria comprometida en KB en el administrador de memoria
  • committed_target_kb: cantidad de memoria, en KB, que puede consumir el administrador de memoria del SQL Server

La segunda vista (sys.dm_os_sys_memory) nos devolverá información de la memoria actual del sistema:

SELECT total_physical_memory_kb, 
       available_physical_memory_kb, 
       system_memory_state_desc
FROM sys.dm_os_sys_memory
  • total_physical_memory_kb: cantidad total de memoria física del sistema.
  • available_physical_memory_kb: cantidad de memoria disponible actualmente.
  • system_memory_state_desc: estado actual de la memoria en función de la disponibilidad de la misma. En el ejemplo podemos observar que es high lo que significa que no tenemos problemas de disponibilidad de memoria.

La tercera y última vista (sys.dm_os_process_memory) nos dará información para determinar si la memoria de proceso física o virtual de SQL Server es baja.

SELECT physical_memory_in_use_kb, 
       process_physical_memory_low, 
       process_virtual_memory_low
FROM sys.dm_os_process_memory
  • physical_memory_in_use_kb: indica la memoria utilizada en KB actualmente.
  • process_physical_memory_low: indica si el proceso responde o no a una notificación de memoria física baja.
  • process_virtual_memory_low: indica si el proceso responde o no a una notificación de memoria virtual baja.

Lo ideal es que tanto los parámetros process_physical_memory_low y process_virtual_memory_low sean 0 ya que esto será señal de que SQL se encuentra en buen estado refiriendo al rendimiento de la memoria.

Monitorizar rendimiento de la memoria mediante la utilidad Monitor de Rendimiento de Windows

Otra opción que tenemos para monitorizar el rendimiento de la memoria de nuestro motor de SQL es utilizando la herramienta integrada en Windows y que conocemos como Monitor de Rendimiento.

En primer lugar abriremos la herramienta Monitor de Rendimiento y crearemos un nuevo recopilador de datos. Para ello, en el árbol, nos dirigiremos a Conjuntos de recopiladores de datos-Definido por el usuario y con el botón derecho pulsaremos sobre Nuevo-Conjunto de recopiladores de datos.

Asignaremos un nombre a nuestro conjunto de recopiladores de datos y lo crearemos de forma manual.

Marcamos Contador de rendimiento.

Una vez creado nuestro recopilador pulsaremos sobre él con el botón derecho y seleccionaremos Propiedades.

No voy a detenerme mucho en explicaros esta nueva pantalla ya que son cosas que seguro todos sabréis configurar pero básicamente os diré que aquí podéis configurar cosas como el usuario que ejecutará el trabajo, realizar una programación para que se ejecute en un momento determinado, la condición que hará que se pare el monitor, etc….

Una vez realizada la configuración anterior nos iremos a nuestro DataCollector y con el botón derecho seleccionaremos Propiedades para agregar los contadores que vamos a utilizar para medir el rendimiento de la memoria de nuestro SQL Server.

En esta pantalla agregaremos los siguientes monitores:

  • \Memoria\Mbytes disponibles: este contador nos indicará la memoria que tenemos disponible en el sistema.
  • \SQLServer:Administrador de búfer\Frecuencia de aciertos de caché del búfer: este contador nos indica el porcentaje de la frecuencia con la que SQL Server puede encontrar páginas de datos en la memoria en lugar de recuperarlas del disco. El valor óptimo debe ser mayor o igual al 98% aunque, bajo mi punto de vista, si no nos encontramos con un valor por debajo del 95% no tendremos que preocuparnos.
  • \SQLServer:Administrador de búfer\Escrituras diferidas/s: este contador muestra cuántas páginas se vacían de la memoria. Este valor estar siempre por debajo a 20 en caso contrario probablemente tendremos que considerar asignarle más memoria a nuestro SQL Server.
  • \SQLServer:Administrador de búfer\Duración prevista de la página: este es uno de los contadores más utilizados ya que representa el número de segundos que una página se alojará en el grupo de búferes sin las referencias. Como os imaginareis aquí desearemos que la página permanezca en el bufer el mayor tiempo posible ya que esto hará que nuestro motor de SQL tenga un rendimiento alto. Un valor adecuado podría ser por encima de 300.

Nota: Las rutas y nombres pueden variar en función de como se llame vuestra instancia de SQL así como en el idioma que lo tengáis.

Una vez lo tenemos todo configurado sólo tendremos que lanzar nuestro monitor y esperar un tiempo para que este empiece a recopilar los datos.

Pasado un tiempo prudencial procederemos a pararlo para que se genere el informe el cual nos servirá para valorar el rendimiento de memoria de nuestro SQL Server en función de las indicaciones que os comenté arriba.

Espero os haya sido de utilidad.

Entradas relacionadas

Deja un comentario