Si los usuarios de su base de datos se han quejado de que el rendimiento de SQL Server ha sido mediocre últimamente, es posible que esté experimentando los efectos de uno o más cuellos de botella de SQL Server. Estos cuellos de botella ocurren por una variedad de razones, pero con frecuencia ocurren como resultado de problemas con la memoria, E/S o CPU.
Aunque no siempre es fácil determinar si los problemas de rendimiento provienen de un cuello de botella de SQL Server o de otra fuente, puede buscar estos síntomas comunes de cuellos de botella para ayudar a reducir la búsqueda del origen del problema.
Síntomas comunes de los cuellos de botella de SQL Server
- SQL Server acaparando el procesador
- Tiempos de ejecución más prolongados en las consultas
- E/S excesiva
- Registro de la aplicación que muestra mensajes de falta de memoria
- Actividad extrema en los discos
- Largos tiempos de espera por E/S
La aparición repentina de uno o más de estos síntomas es una buena indicación de que tiene un cuello de botella de SQL Server en algún lugar de su sistema. Ahora, es tu trabajo encontrarlo.
Tipos de cuellos de botella de SQL Server
Hay tres tipos principales de cuellos de botella de SQL Server:memoria, E/S y CPU. Es importante que los administradores de bases de datos estén familiarizados con las causas, los síntomas y las soluciones de cada uno para que puedan identificar y eliminar los cuellos de botella rápidamente y minimizar el impacto de un rendimiento deficiente. También hemos incluido algunos de los mejores contadores de rendimiento para monitorear que ayudarán a identificar los cuellos de botella de rendimiento de inmediato.
Cuellos de botella de memoria
Los cuellos de botella de la memoria suelen ser el resultado de recursos de memoria insuficientes o de actividades de SQL Server que consumen la memoria disponible. Los síntomas a tener en cuenta incluyen tiempos de ejecución de consultas más prolongados, E/S excesiva, mensajes de falta de memoria en el registro de la aplicación y bloqueos frecuentes del sistema.
Las mejores formas de evitar los cuellos de botella relacionados con la memoria son usar un optimizador de consultas para deshacerse de las consultas innecesarias u obsoletas y configurar la expectativa de vida de la página junto con la tasa de aciertos de la caché del búfer para limitar los viajes al disco. Si es demasiado tarde para evitar el cuello de botella, intente revisar y ajustar las consultas, reconfigurar la memoria o agregar memoria física.
Contadores para supervisar:memoria disponible, memoria total del servidor, memoria del servidor de destino, páginas/seg., índice de aciertos de caché de búfer
Cuellos de botella de E/S
Cuando no hay suficiente almacenamiento disponible para admitir las operaciones regulares de la base de datos, como TempDB, es probable que se produzcan cuellos de botella de E/S. Los tiempos de respuesta prolongados, la ralentización de las aplicaciones y los tiempos de espera de tareas frecuentes son indicadores clave de que tiene un cuello de botella de E/S.
Puede evitar este tipo de cuello de botella configurando el monitoreo con alarmas y alertas de umbral para identificar qué actividades usan cantidades excesivas de almacenamiento. Si se produce un cuello de botella de E/S, limite la lectura y escritura de las páginas de la base de datos hacia y desde el disco. Esto requerirá que verifique y corrija escaneos de índice frecuentes, consultas ineficientes y estadísticas desactualizadas.
Contadores para monitorear:longitud promedio de cola de disco, promedio de segundos de disco/lectura, promedio de segundos de disco/escritura, % de tiempo de disco, promedio de lecturas de disco/segundo, promedio de escrituras de disco/segundo
Cuellos de botella en la CPU
La causa principal de los cuellos de botella de la CPU son los recursos de hardware insuficientes. Es bastante fácil identificar este cuello de botella revisando sus registros para determinar si SQL Server está usando una CPU excesiva.
En un mundo ideal, podría evitar los cuellos de botella de la CPU si tuviera un servidor exclusivo de SQL Server y ejecutara el resto del software en otra máquina. Debido a que esa no es una opción para la mayoría de los administradores de bases de datos, deberá saber cómo desbloquear su CPU.
El primer paso es identificar los cerdos de la CPU. Una vez que sepa dónde radica el problema, puede ajustar las consultas, mejorar sus planes de ejecución o reconfigurar el sistema.
Contadores para monitorear:% de tiempo de procesador, solicitudes por lotes/seg, compilaciones SQL/seg, recompilaciones SQL/seg
Una historia sobre cuellos de botella en el rendimiento de SQL Server
"Tenemos algunos cuellos de botella en el rendimiento de SQL Server con los que lidiar", dijo mi jefe un viernes por la noche.
"¿Cómo lo sabes?" pregunté.
“Ventas se queja de que su base de datos se ha ralentizado últimamente. Tenemos que ver qué está pasando con eso”.
"DE ACUERDO. Reservaré una sala de conferencias para que podamos sentarnos y trabajar en eso”.
“No te molestes”, dijo el jefe. “Es tarde en un viernes por la tarde. Eso significa que la mejor manera de estudiar los cuellos de botella es con un par de nosotros. Vamos a Pike Pub en el mercado”.
Entramos en un bar escondido en Pike Place Market y encontramos una pequeña mesa junto a la ventana.
“¿Cuál es tu tipo de cuello de botella favorito?” preguntó el jefe.
Dije que era partidario de Naughty Nellie en el cuello de botella de 22 onzas.
“Buena elección”, dijo el jefe. "Tú pides eso y yo tomaré la Citrus Summer Ale".
Mientras esperábamos a que llegaran nuestros cuellos de botella, nos pusimos manos a la obra con los cuellos de botella de rendimiento de SQL Server.
“Tendremos que buscar problemas en varios lugares”, dijo el jefe. “Podrían ser problemas con la memoria, el almacenamiento o los procesadores, pero todos tienen el mismo aspecto para los usuarios, ¿verdad? Rendimiento pésimo.
“Los problemas de la CPU no son tan difíciles de encontrar. Si ese es el problema, veremos que SQL Server está acaparando el procesador y provocando picos todo el tiempo.
“Si se trata de un problema de memoria, veremos cosas como tiempos de ejecución más largos en las consultas y más E/S porque la aplicación tiene que seguir ejecutándose en el disco. También podemos comprobar el registro de la aplicación en busca de mensajes de memoria insuficiente.
"Y si el cuello de botella está en el almacenamiento, veremos una actividad extrema en los discos y largos tiempos de espera por I/O".
Llegaron nuestros cuellos de botella. Los estudiamos cuidadosamente mientras considerábamos el problema de rendimiento más profundamente.
Las muchas fuentes potenciales de cuellos de botella en el rendimiento de SQL Server
“¿Qué pasa si es un problema de E/S?” Yo pregunté. “Deberíamos ver si el tiempo de espera de WRITELOG es demasiado alto, en comparación con el tiempo de espera total. O, hablando de E/S, tal vez haya un problema en el propio SQL. Si hay un código ineficiente, como una UNIÓN DE BUCLE ANIDADO en una tabla enorme, el SQL podría estar solicitando leer filas en la tabla interna millones de veces. Eso realmente castigaría el rendimiento”.
“Podría ser”, dijo el jefe. “Las operaciones complejas de unión y clasificación pueden ser difíciles, especialmente cuando la base de datos tempdb no está configurada correctamente. La contención de tempdb parece bloqueos de bases de datos comunes, pero en realidad es una contención bloqueada debido a procesos concurrentes que esperan su turno en las páginas de asignación”.
“¿Qué herramientas podemos usar para examinar todas estas cosas?” pregunté.
“SQL Server tenía un generador de perfiles para examinar los procedimientos almacenados, pero está obsoleto. Algo así es una buena manera de encontrar y diagnosticar consultas problemáticas, incluso si es solo el primer paso. Luego están las vistas y funciones de administración dinámica que lo ayudan a monitorear la salud de su servidor y base de datos, solucionar problemas y ajustar su SQL”.
“Pero SQL Server tiene muchas partes móviles”, dije. "Prefiero tener una herramienta que mire la imagen completa de afuera hacia adentro".
"Yo también. Preferiblemente desde la nube, por lo que no necesitamos más hardware y software en las instalaciones para hacerlo".
Aliviar los cuellos de botella de rendimiento en SQL Server
Pike estaba empezando a llenarse. Y, a pesar de lo dispuestos que estábamos el jefe y yo a sentarnos en un pub y hablar de negocios, después de todo, era viernes por la noche. Teníamos otros lugares a donde ir, otras personas para ver y otras cosas de las que hablar.
“¿Qué debemos hacer una vez que hayamos encontrado los cuellos de botella?” pregunté.
“Reunimos a los sospechosos habituales”, dijo el jefe. “Para evitar usar demasiada memoria, debemos decirles a los desarrolladores de bases de datos cuál de sus códigos y consultas tienen fugas de memoria. Si encontramos operaciones que unen cuatro, cinco o seis tablas, tendremos que dar a los desarrolladores algunos consejos de ajuste de SQL Server y las mejores prácticas para rediseñar la base de datos. O puede que tengamos demasiados índices y estemos desperdiciando ciclos actualizándolos; eso es tan difícil para la CPU y la E/S como tener muy pocos índices. Es posible que tengamos un problema con la fragmentación del índice de SQL Server o que debamos eliminar los índices obsoletos y duplicados”.
“Tiene sentido,” dije. “Tal vez necesitemos lanzarle más hardware. Los discos más rápidos pueden ayudar con los cuellos de botella de E/S. Más CPU y más rápidas marcan la diferencia en los tiempos de respuesta de las consultas. Y agregar RAM significa más escalabilidad de SQL Server, ¿verdad?”
“Sí”, dijo el jefe, “pero primero quiero asegurarme de que la causa raíz no sea un problema de desarrollo o DevOps. Una vez que esté convencido de que no lo es, jugaré la carta Comprar más hardware”.
Nos sentamos un momento y vimos cómo el pub se llenaba de juerguistas los viernes por la noche.
"Jefe", le pregunté, "¿cree que todas estas personas saben cuán despreocupadas son sus existencias, sin la carga de lidiar con sesiones bloqueadas, la espera máxima de E/S, la expectativa de vida de la página y las proporciones de aciertos de caché de búfer?"
"Es una cruz para llevar, ¿no?" respondió el jefe. “La mayoría de la gente no tiene idea de lo que estamos pasando. Menos mal que lidiamos con los cuellos de botella en el rendimiento de SQL Server de manera tan silenciosa, con tanta gracia bajo presión y con tan buen gusto. Hablando de buen gusto, ¿cómo te va con tu cuello de botella?”
Lo comprobé. “Mi cuello de botella está vacío. Mi botella también”.
"Mío también. Hora de irse. Tenemos trabajo que hacer”.
¿Es posible un sistema de cero cuellos de botella de SQL Server?
Sabemos que hay pasos que podemos tomar para evitar estos tres tipos comunes de cuellos de botella de SQL Server. Pero, ¿es posible configurar una base de datos de SQL Server tan bien que no tenga cuellos de botella?
La respuesta corta es probablemente no. Incluso el DBA más diligente tendrá cuellos de botella en SQL Server de vez en cuando. Pero puede tomar medidas para evitar de forma proactiva los cuellos de botella y minimizar su impacto en el rendimiento. Por ejemplo, Brent Ozar ofrece excelentes consejos para monitorear los contadores de Perfmon para ajustar su SQL Server, y puede usar la vista sys.dm_os_performance_counters para ayudar a identificar cuellos de botella y corregirlos rápidamente.
Los cuellos de botella de SQL Server son un hecho de la vida de DBA. Afortunadamente, con una supervisión adecuada, un control diligente y un ajuste frecuente de las consultas, los problemas de rendimiento se pueden solucionar antes de que los usuarios sepan que existe un problema.