Sitio web lento, servidor inactivo: encontrar adónde va el tiempo
Se culpa primero a la base de datos porque es donde se siente la espera; medir cada nivel de una petición lenta muestra dónde se gasta el tiempo en realidad.
En este artículo 4 secciones
- Una página lenta y una base de datos ocupada parecen lo mismo desde el recuento de conexiones, porque la base de datos es la última parada síncrona de la mayoría de las peticiones y hereda cada bloqueo que hay por encima.
- Trace una URL lenta nivel por nivel: el borde, la máquina, la aplicación, después la base de datos. El nivel al que pertenece el tiempo rara vez es el que nombra el ticket.
- Una máquina más grande acorta la parte de la petición que ya era corta. Mida antes de comprar nada.
Por qué la base de datos es la sospechosa habitual
Cuando una página se ralentiza, la base de datos es donde el síntoma se hace visible primero. Las conexiones se acumulan, la lista de procesos se llena de consultas en estado sending data, y el slow query log empieza a crecer. Todo eso es real, y nada de eso dice adónde fue el tiempo. La base de datos está al final de la mayoría de las rutas de petición. Una página que la llama doscientas veces en lugar de dos, un worker que mantiene una conexión abierta mientras espera a una pasarela de pago, una caché que se está saltando en cada acceso: cada uno de ellos aparece como carga de base de datos, porque la base de datos hace exactamente lo que se le pide, más veces de las que debería pedírsele.
Lo mismo vale para el servidor. Una máquina con carga alta es una máquina a la que se le está dando trabajo. Si el trabajo es necesario es una pregunta que la gráfica de carga no puede responder.
Trace una petición, no todo el sitio
El método es elegir una URL lenta y seguirla por los niveles, midiendo en cada frontera. Empiece desde fuera, desde una máquina que no esté en la misma red, y deje que curl informe de adónde va el tiempo antes de que llegue el primer byte.
$ curl -o /dev/null -s -w 'dns %{time_namelookup} connect %{time_connect} tls %{time_appconnect} ttfb %{time_starttransfer} total %{time_total}\n' https://www.example.com/slow-pageSi el tiempo hasta el primer byte es la mayor parte del total, la espera está en el lado del servidor. Si el total es mucho mayor que el tiempo hasta el primer byte, la página es pesada o la ruta entre el visitante y el borde es la historia, y el servidor no formó parte de la espera.
En la máquina, muestree la CPU mientras la petición lenta está en curso, no una hora tranquila después.
$ mpstat -P ALL 1 5
$ vmstat 1 5Un servidor mayormente inactivo durante una petición lenta, sin iowait y sin steal, se ha exonerado a sí mismo. El tiempo se está gastando esperando a algo, no computando.
Después la aplicación. La mayoría de los frameworks pueden registrar, por petición, el número de consultas emitidas, el tiempo total pasado en ellas y el tiempo pasado en llamadas HTTP salientes. Actívelo para la URL lenta. Dos números zanjan la discusión: cuántas consultas emite una página, y cuánto del tiempo de reloj se pasó completamente fuera de la aplicación.
Por último la base de datos, con el slow query log activado y el umbral lo bastante bajo como para capturar lo que importa.
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 0.2;
SET GLOBAL log_queries_not_using_indexes = ON;Lea el registro para la ventana de la petición lenta. Un puñado de consultas que tardan segundos cada una es un problema de base de datos. Miles de consultas que tardan un milisegundo cada una es un problema de aplicación del que se está culpando a la base de datos.
Los patrones que salen de la medición
Con los niveles separados, la causa tiende a tomar una de unas pocas formas.
Un endpoint llamado en bucle. Un front end que vuelve a pedir el mismo recurso en cada cambio de estado, o una página que emite una consulta por fila en lugar de una consulta por página. La base de datos responde rápido a cada llamada; el problema es la cantidad.
Una llamada síncrona a otro. Un proveedor de pagos, un ERP, una API de envíos, un gestor de etiquetas, sentados en la ruta de la petición detrás de un timeout largo. El servidor está inactivo durante toda la espera, y la página es tan lenta como el tercero más lento del que depende.
Una caché que se está anulando. Cabeceras que prohíben la caché en páginas que no cambian, o ninguna caché de borde delante de tráfico anónimo que nunca fue dinámico.
Pools dimensionados a ojo. Pools de workers, de conexiones y de buffers configurados demasiado grandes tan a menudo como demasiado pequeños. Un pool mucho mayor de lo que la máquina puede servir de forma concurrente convierte una cola en un thrashing.
El agotamiento real es la última forma, y cuando aparece suele estar aguas abajo de una de las tres primeras. Que la máquina se quede sin algo es el final de la historia, no el principio.
Qué cambia un servidor más grande
Añadir núcleos o memoria acorta la parte de la petición que estaba computando. Si esa parte ya era pequeña, la página no se vuelve más rápida; la espera se traslada con ella. El bucle sigue en bucle, el tercero sigue tardando lo suyo, la caché sigue anulada. La ampliación además esconde la medición que habría encontrado la causa, porque la gráfica que estaba en rojo ahora está en ámbar, y el ticket se cierra.
Por eso trazamos antes de presupuestar. Una plataforma sana se mantiene aburrida, y el trabajo consiste en encontrar el nivel al que pertenece el tiempo, incluso cuando ese nivel está por encima de todo lo que operamos, y en devolver la medición que señala la línea.
Respuestas directas
¿Por qué mi sitio web va lento si el servidor tiene CPU y RAM de sobra?+
Porque el tiempo se está gastando esperando, no computando: en un bucle de llamadas, en una API de terceros en la ruta de la petición, en una caché que se anula, en una consulta emitida miles de veces. Un servidor inactivo durante una petición lenta es una pista fuerte de que la espera vive por encima del hardware.
¿Un sitio web lento suele ser la base de datos?+
La base de datos suele ser donde se ve la espera, porque es la última parada síncrona de la petición y hereda cada bloqueo que hay por encima. Si es la causa lo decide el slow query log: unas pocas consultas lentas apuntan a la base de datos, un aluvión de consultas rápidas apunta a la aplicación.
¿Debo comprar más RAM o un servidor más grande para arreglar un sitio lento?+
No antes de la traza. La capacidad acorta la parte de cómputo de una petición. Si la petición estaba esperando en lugar de computando, la ampliación traslada la espera en lugar de eliminarla, y esconde la gráfica que habría encontrado la causa.
¿Cómo se distingue un problema de aplicación de un problema de base de datos?+
Cuente y cronometre. Por petición: cuántas consultas, cuánto tiempo en total, cuánto tiempo en llamadas salientes. Por consulta: el slow log. Si el tiempo por consulta es bajo y el recuento alto, la aplicación pregunta demasiado a menudo. Si el tiempo por consulta es alto, el problema es la consulta, el índice o el esquema.
Tráiganos su URL más lenta y la trazaremos nivel por nivel hasta la línea a la que pertenece el tiempo.
Hable con un ingeniero.
Hable con un ingenieroHa llegado al final.
Ponga la lectura a trabajar
¿Qué está ejecutando?
Cuéntenos la carga de trabajo, el tráfico y los requisitos de recuperación. Empiece por el configurador de servidores o repase los detalles con un ingeniero.
Escrito por los ingenieros que construyen y operan la infraestructura que describe.Hable con un ingeniero
