xEvents

Descubriendo qué llena la TempDB con xEvents

Hace un par de semanas, os preparé un artículo sobre la TempDB en el que pudimos ver, qué es, para qué sirve, por qué se llena y cómo optimizarla. Sin embargo, nos dejamos una cosa en el tintero y es algo que muchos me habéis señalado. Aunque hablamos también de cómo vaciar la TempDB no profundizamos en cómo saber qué consultas son las causantes del llenado de la TempDB. Hoy vamos a ver justo eso, y para ello nos vamos a apoyar en una herramienta de la que también os he hablado, los eventos extendidos de SQL Server.

Un pequeño repaso de la TempDB

No es el objetivo de este artículo profundizar en la teoría de la TempDB, para eso tenemos el artículo del pasado 13/02/2024. Pero, si que tenemos que repasar algunos de esos conceptos para no perdernos ahora. La TempDB es la base de datos de sistema con ID número 2 que se crea cada vez que se inicia el servicio de SQL Server y se elimina al pararlo. 

En esta base de datos se almacenan datos de intercambio de las consultas en curso ya sean datos de paginación de memoria para ordenar u operar con registros como datos almacenados por petición de los usuarios en tablas temporales (de una sesión o globales). Estas funcionalidades son las que hacen esta base de datos susceptible de crecer muy rápido e incluso de terminar llenándose completamente. Como comprenderás, llenar completamente una base de datos que se usa para prácticamente todo puede tener consecuencias fatales, llegando a dejar inoperativo nuestro servidor.

Otro pequeño repaso a xEevents

Como ya vimos hace un par de días, los eventos extendidos son una poderosa herramienta de SQL Server para los DBAs. No solo nos van a ayudar, como hoy, a detectar errores en la TempDB, sino también a monitorizar completamente el estado de nuestro servidor. Sin ir más lejos, ayer pudimos ver como usar xEvents para localizar consultas con mucho consumo de CPU.

Errores de TempDB 

Para nuestro ejercicio de hoy vamos a partir de la base de los errores de falta de espacio en el archivo de datos de SQL Server y vamos a crear una sesión de xEvents que nos almacene la consulta que los ha provocado cuando se den en la base de datos TempDB. Estos errores son el 1101 y el 1105

Como podéis ver, ambos errores son muy parecidos y la solución para ambos es la misma: revisar que el crecimiento sea el correcto, añadir espacio para que pueda crecer el fichero o liberar espacio en el fichero.

Sesión de xEvents

Nosotros nos vamos a centrar hoy en detectar las consultas causantes del problema para poder trabajar sobre ellas y no necesitar tanto espacio en TempDB. Para ello, vamos a hacer uso de una sesión de xEvents.

No me lio más, vamos a ponernos manos a la obra. Para nuestra sesión de XE vamos a capturar los eventos sqlserver.error_reported. Cómo vimos en el artículo de los eventos extendidos, vamos a poder usar las acciones para capturar información extra. En este caso vamos a capturar la base de datos y toda la información relevante sobre la consulta que ha disparado el error. Con esto, estaríamos capturando todas las consultas que generen un error en SQL Server pero como lo que nosotros queremos son solo los errores de espacio en TempDB vamos a hacer uso de los filtros. En concreto vamos a crear 3 filtros, el primero será que la base de datos sea la de id número 2 que ya hemos visto que es la que nos interesa, crearemos también un filtro por los errores 1101 y 1105 que nos interesan y terminaremos con un filtro por id de sesión superior a 50 para quitarnos las consultas del sistema de la captura. El resto de configuraciones son las genéricas que ya vimos.

Este sería el script de nuestra sesión de xEvents:

Revisando los resultados de xEvents:

Una vez creada e inicializada nuestra sesión podremos ver los datos en tiempo real desde la interfaz gráfica de nuestro SSMS:

Otra opción será consultar el fichero de la sesión con una consulta T-SQL.

En cualquiera de los casos podremos ver todas las consultas que han dado error por falta de espacio en TempDB y cómo lo vamos a ver ordenado por fecha solo nos tendremos que ir a la primera para descubrir al causante de la incidencia y poder reeducarle (siempre respetando los derechos humanos, ya sabéis).

Conclusión

Enfrentarse a un problema de consumo de TempDB puede ser un verdadero dolor de cabeza (por no decir otra parte de la anatomía masculina) pero, con las herramientas adecuadas podremos afrontarlo de manera sencilla. Para luego es tarde, no esperes a tener un problema en TempDB y echar de menos esta sesión de xEvents, ponla en tu servidor de pruebas (puedes jugar con el tamaño máximo del fichero de TempDB para reproducir el error) y, si te convence, aplicalo en tus servidores más críticos.

Esperamos que este artículo os haya sido útil y os animamos a seguir aprendiendo sobre SQL Server con nosotros. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Rendimiento, SQL Server, 1 comentario

SQL consume mucha CPU. Solución a problemas de procesador

La semana pasada hablamos sobre el uso excesivo de RAM en SQL Server. Hoy, vamos a abordar otro problema común que puede afectar el rendimiento de nuestros servidores: el consumo elevado de CPU. El consumo excesivo de CPU en SQL Server puede afectar significativamente el rendimiento y la estabilidad del sistema. En este artículo, compartiremos estrategias efectivas para identificar y abordar las causas subyacentes de este problema.

Identificando el problema

Como resumía Don Castelino en uno de los mejores artículos que existen sobre este tipo de incidentes, lo primero que debemos determinar es de donde viene el problema. Si recordáis, en el caso de la RAM, teníamos una cantidad de memoria reservada para SQL y sobre eso, podíamos ver el consumo. En el caso de la CPU la cosa se complica porque la CPU es compartida con el sistema operativo y todos los demás procesos que haya en el servidor. Por este motivo, tendremos muchas más variables que analizar. La siguiente imagen resume la lista de comprobaciones que debemos realizar.

Vamos a ponernos en situación: Estamos ante un problema de rendimiento, nos dirigimos al administrador de tareas de Windows en nuestro servidor y vemos un consumo de CPU del 100% o cercano a esa cifra de manera continuada. Lo primero que debemos hacer será, en el mismo administrador de tareas, determinar si el mayor consumo de CPU viene de SQL Server o de otros procesos. En caso de que el consumo de SQL Server no supere, de manera constante, el 70% del total deberemos ver con los administradores de sistemas que otras cosas están causando el incidente en nuestro servidor. 

Como eso sería muy fácil, y ya habriamos terminado aquí el artículo, vamos a suponer que vemos que el problema de CPU sí que viene de SQL Server. Analicemos los siguientes pasos.

Batch Request por segundo

Una de las medidas que debemos tomar junto con el consumo de CPU es la cantidad de procesos batch por segundo que está ejecutando nuestro servidor SQL Server. Podemos encontrar este dato de forma sencilla en el monitor de rendimiento de nuestro SSMS o en el Performance Monitor de Windows. De esta manera veremos, de forma clara si nuestro SQL está ejecutando muchos procesos de manera simultánea o si, por el contrario, con pocos procesos generamos ese alto consumo de CPU. 

Debemos conocer y familiarizarnos con esta medición pues, no hay un valor estándar para todos los SQL Server. Depende mucho del procesador que tengamos, sus núcleos y su velocidad así como de los procesos que normalmente se ejecutan. Yo he visto, desde servidores donde un valor cercano a 1000 batch por segundo suponían un problema, como servidores con 15 o 20 veces ese valor que funcionaban perfectamente. 

Vista sys.dm_exec_query_stats

Una de las vistas de administración dinámica de SQL Server que nos va a ayudar a solucionar problemas de rendimiento de CPU es sys.dm_exec_query_stats. En ella vamos a poder ver las consultas con mayor consumo de CPU que tenemos en SQL Server. Si además la combinamos con la función sys.dm_exec_sql_text podremos ver el texto de las consultas. Volviendo a la vista, esta nos va a aportar gran cantidad de información entre la que nos vamos a quedar con el conteo de ejecuciones, y los tiempos de ejecución máximo, mínimo y total. Además, os recomiendo ordenar por este último, pues el problema puede ser la ejecución repetida de una consulta ligera y no tanto la ejecución única de una consulta pesada.

Eventos Extendidos

La vista que hemos visto antes, nos puede dar las consultas recientes más pesadas, sin embargo, no nos será de ayuda ante un problema de consumo de CPU que no sea reciente. Para esto podemos usar otra de las formas de monitorización más potentes que incluye SQL Server, los eventos extendidos. Vamos a usar el evento query_post_execution_showplan que aunque ya dijimos que es pesado es lo más potente para este tipo de situaciones. Además vamos a capturar algunas acciones extra como el identificador del proceso, la base de datos, el usuario y el texto de la consulta. Para terminar, yo he añadido un filtro para solo capturar las consultas de más de 20 segundos de duración (recordad que el valor se muestra siempre en microsegundos). Este sería el script de mi sesión de xEvents:

Conclusión

Espero que a partir de ahora estéis más pereparados para afrontar problemas de rendimiento de CPU. Las herramientas que os he facilitado pueden ser de gran utilidad pero no son las únicas. En este sentido, QueryStore también puede ser un gran aliado, aunque aún no lo hayamos visto en este blog (espero solucionar esto pronto) os recomiendo que busquéis información y probéis la herramienta. 

Los más entendidos, habréis notado que no hemos mencionado en ningún momento las configuraciones de paralelismo de la instancia SQL Server. Esto es porque en este artículo hemos partido de la base de solucionar un problema de rendimiento en un servidor correctamente configurado. Le dedicaremos un artículo a estas configuraciones más adelante.

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 en Rendimiento, SQL Server, 3 comentarios

Eventos Extendidos en SQL Server: Una Guía Completa

Bienvenidos a este emocionante viaje al corazón de SQL Server. Hoy, nos sumergimos en el fascinante mundo de los eventos extendidos (también conocidas como Extended Events, xEvents o simplemente XE). Si aún estás utilizando el antiguo SQL Profiler/SQL Trace, es hora de dar la bienvenida a una herramienta más moderna y poderosa. En este artículo, explicaremos cómo crear sesiones de eventos, analizar datos y obtener información valiosa sobre el motor interno de SQL Server.

¿Qué son los eventos extendidos?

Los eventos extendidos son una herramienta poderosa para supervisar y solucionar problemas de rendimiento en SQL Server, Azure SQL Database y Azure SQL Managed Instance. A diferencia de las características obsoletas de Seguimiento de SQL y SQL Server Profiler, los xEvents ofrecen una mayor flexibilidad y escalabilidad.

Los Extended Events son una característica ligera de monitoreo de rendimiento que nos permite recopilar datos para supervisar y solucionar problemas. A diferencia del antiguo SQL Trace, xEvents ofrecen una visión escalable del comportamiento de SQL Server con un impacto mínimo en el rendimiento.

Ventajas de los Eventos Extendidos

Como ya hemos señalado, una de las mayores virtudes de los Eventos Extendidos es su ligereza. Los xEvents utilizan recursos mínimos del sistema. Todo esto además proporcionándonos un grado de precisión y detalles como ninguna otra herramienta. Son capaces de proporcionarnos una vista detallada del motor de base de datos a través de una interfaz gráfica. Y es que esta es otra de sus ventajas, nuestro SQL Server Management Studio (SSMS) ofrece una interfaz gráfica para crear, modificar y analizar sesiones de eventos.

Conceptos Clave

Antes de empezar a crear nuestra primera sesión de eventos extendidos tenemos que conocer una serie de conceptos que vamos a necesitar.Si habéis trabajado antes con el seguimiento de eventos para Windows esto os va a sonar, xEvents se basa en estos conceptos para llevar esta monitorización a SQL Server. Sin embargo, necesita de conceptos nuevos que son específicos de SQL Server. Vamos a ver los principales.

Motor de Eventos Extendidos

Es la base de todo esto, el motor de xEvents implementa y administra las sesiones de eventos extendidos. Es responsable de recopilar y relacionar los datos.

Sesiones de Eventos Extendidos

Una sesión se crea en el proceso del motor de base de datos donde se hospeda el motor de eventos extendidos. Proporciona el contexto necesario para comprender la infraestructura y el procesamiento que ocurre.

Paquetes de Eventos Extendidos

Los paquetes son contenedores de objetos que las sesiones de eventos extendidos utilizan para obtener y procesar datos durante su ejecución.

Destinos de Eventos Extendidos

Los consumidores de eventos pueden recibir datos durante una sesión. Llamamos consumidores de eventos al destino que va a recibir la información que extraemos de nuestra sesión de XE. Pueden ser archivos, tablas o incluso aplicaciones externas.

Arquitectura de Eventos Extendidos

Ahora que ya tenemos claro los conceptos básicos de los eventos extendidos podemos profundizar más técnicamente. xEvents es un sistema de control de eventos para servidores que permite la correlación de datos del motor de base de datos y, en ciertas condiciones, de las bases de datos y del sistema operativo. Los datos de eventos se pueden utilizar dentro y fuera de una aplicación, proporcionando información útil para la supervisión y el rendimiento. Los datos se pueden consumir o analizar mediante diversas herramientas, como SQL Server Management Studio, XEvent Profiler o el Monitor de rendimiento.

El diseño de Eventos Extendidos es flexible e independiente del evento, permitiendo que cualquier evento se enlace con cualquier destino. Es decir, los eventos están separados de los consumidores de eventos, lo que significa que cualquier destino puede recibir cualquier evento. Además, se pueden asociar acciones a cualquier evento y se pueden filtrar dinámicamente los datos del evento. XE puede generar datos de eventos de forma sincrónica y proporciona un enfoque unificado para controlar los eventos en todo el sistema del servidor, integrándose con las herramientas de ETW existentes y ofreciendo un mecanismo configurable de control de eventos que utiliza T-SQL.

Crea tu sesión de Eventos Extendidos

Ya hemos dicho que una de las ventajas de los xEvents es su interfaz gráfica. Desde SSMS, conectados a una instancia de bases de datos encontraremos la opción Eventos Extendidos en el apartado Administración. Tenemos además un asistente para facilitarnos la tarea de creación de sesiones que nos irá guiando por los pasos necesarios además de poder elegir entre diferentes plantillas ya predefinidas.

Explorando los Datos

Una vez que tengamos nuestra sesión de eventos, podremos ver los datos que nos proporciona. Uno de los eventos más interesantes es query_post_execution_showplan, que nos ofrece el plan de ejecución real después de que se haya ejecutado una consulta. Esto incluye estadísticas de rendimiento en tiempo real. 

Sin embargo, este evento tiene un alto costo Por suerte, existen alternativas más ligeras para obtener planes de ejecución individuales como query_thread_profile. Disponible desde SQL Server 2014 SP2 y SQL Server 2016, este evento muestra un perfil detallado por operador e hilo de ejecución en un plan real. Aunque puede ser muy detallado, es útil para análisis a gran escala.

Conclusión

En resumen, los eventos extendidos son una herramienta esencial para cualquier administrador o desarrollador que desee profundizar en el rendimiento y la optimización en entornos SQL Server. Son una herramienta poderosa para comprender el comportamiento interno de SQL Server. Al adoptarlas, obtendrás información valiosa sin afectar significativamente el rendimiento del sistema. 

¡Espero que esta guía te ayude a aprovechar al máximo los eventos extendidos! Sigue atento al blog porque a lo largo de esta semana vamos a publicar artículos más prácticos donde usaremos estos eventos extendidos para solucionar problemas de rendimiento de nuestro SQL Server.

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 en SQL Server, 4 comentarios