Ir al contenido
EuroVPSEuroVPS

Les dijimos que no compraran más RAM.

Una tienda online de artículos para el hogar tuvo una mañana de errores «too many connections». La solución obvia era más RAM. Los datos dijeron que no la gastaran: el working set ya cabía en memoria, y la respuesta estaba en las propias reglas de la aplicación.

Por EuroVPS EngineeringLa sala de máquinas

5 min de lectura
En este artículo 3 secciones
En resumen
  • La base de datos de una tienda online de artículos para el hogar empezó a devolver ERROR 1040: Too many connections una mañana, justo después de que se llenara su espacio de tablas temporales.
  • La solución obvia era más RAM: una base de datos mayor que su buffer pool parece hambrienta. Ampliar el pool habría costado dinero y no habría arreglado nada.
  • La medición lo desmintió. El buffer pool acertaba en su caché casi siempre y aún tenía sitio de sobra. El working set ya estaba en memoria.
  • La causa real era una tabla de reglas de descuento que había crecido mucho más allá de lo que la tienda necesitaba. La corrección estaba en las reglas de la aplicación, no en más RAM.

Empezó como una mañana de errores de conexión. El espacio de tablas temporales, en tmpfs, se había llenado, y segundos después la base de datos empezó a responder ERROR 1040: Too many connections. Nuestro ingeniero de guardia lo tenía en pantalla en pocos minutos, y lo trabajamos junto con los desarrolladores de la tienda desde el principio.

THE MORNING, IN TWO LINES
temp-table space (tmpfs) ........ FULL
… seconds later …
mysqld: ERROR 1040 (HY000): Too many connections

La respuesta cara, y por qué la dejamos a un lado

THE REFLEX THAT LOOKS LIKE PROGRESS

Una base de datos mayor que su buffer pool, y memoria libre en la máquina. Todos los números superficiales apuntan en la misma dirección: dele más RAM al pool, listo. Parece progreso y cuesta dinero de verdad. La medición dijo que no arreglaría nada.

LA RESPUESTA CARALO QUE DIJERON LOS DATOS
La base de datos es mayor que el pool. Amplíe el pool.La tasa de aciertos de caché era casi perfecta. El working set ya vivía en memoria.
Una caché mayor arregla el desbordamiento.El pool ya tenía espacio sin usar. Más RAM cachearía datos que ya estaban cacheados.
GANARON LOS DATOSAñada hardware, problema resuelto.La tabla sobredimensionada sigue creciendo detrás del pool mayor hasta desbordarse otra vez.

Dos lecturas lo zanjaron. El buffer pool casi nunca fallaba, y aún le quedaban páginas libres. Juntas dicen una sola cosa: el working set ya cabía entero en memoria. No había datos esperando en disco para que los retuviera una caché mayor.

La causa real estaba en los tamaños de las tablas

Descartada la memoria, fuimos a los tamaños de las tablas. Una destacaba: la tabla de combinaciones de reglas de descuento, con diferencia el objeto más grande de la base de datos.

Esa tabla se genera a partir de las reglas de descuento activas de la tienda, y las combinaciones crecen con el cuadrado del número de reglas. Con el tiempo las reglas se habían acumulado, y la tabla había crecido con ellas. Las consultas sobre ella desbordaban el espacio de tablas temporales, y ese desbordamiento acababa en agotamiento de conexiones. El error 1040 era la última ficha del dominó, no la primera.

WHERE THE SPACE WENT
# table name is an illustrative rename.
> table sizes, largest first
discount_rule_combinations   largest table by a wide margin
  ↳ generated from the active discount rules
  ↳ combinations grow with the SQUARE of the rule count

La respuesta disciplinada y la respuesta cara apuntaban en direcciones opuestas

Un pool mayor habría comprado tiempo, y la tabla habría seguido creciendo detrás de él. Solo una respuesta tocaba la causa real: ordenar las reglas de descuento, limitar las combinaciones y dejar el hardware como estaba. Los desarrolladores de la tienda hicieron el cambio, y los errores cesaron.

La máquina nunca fue el problema. Los datos mostraron que el working set ya cabía en memoria, así que la corrección estaba en las reglas de la aplicación, no en más RAM. Lo más útil que podíamos entregarle a este cliente no era más hardware nuestro. Era una razón para no comprarlo.

“A veces lo más valioso que puede decirle un proveedor de hosting es: no gaste el dinero.”

LA LECCIÓN

Respuestas directas

Mi base de datos lanzó «ERROR 1040: Too many connections». ¿Debo subir el límite de conexiones?+

Normalmente no. Un techo más alto no arregla lo que mantiene las conexiones abiertas, solo deja que se acumulen más antes de que algo salte. Un límite razonable falla rápido y mantiene el daño pequeño. Encuentre qué retiene las sesiones antes de subir el número.

¿Debo añadir más RAM si mi base de datos es mayor que mi buffer pool?+

No solo por ese dato. El número que lo decide es la tasa de aciertos del buffer pool, no el tamaño en disco. Si el pool ya acierta casi siempre y tiene páginas libres, el working set cabe en memoria y la RAM adicional cachearía datos que ya están ahí.

¿Cuál es una tasa de aciertos normal del buffer pool de InnoDB?+

Por encima del 99 por ciento una vez que el working set cabe en memoria. Si el pool ya está ahí y aún tiene páginas libres, un pool mayor no compra nada. Mire las consultas.

¿Por qué se llena una y otra vez el espacio de tablas temporales de mi MySQL?+

Normalmente una consulta que produce muchas más filas intermedias de las que el resultado necesita. Aquí una tabla de reglas de descuento muy grande desbordó el espacio de tablas temporales, y eso acabó en agotamiento de conexiones. La corrección estaba en los datos, no en el disco.

¿Me dirá EuroVPS que no compre una ampliación?+

Sí, cuando los datos dicen que la ampliación no arregla nada. Preferimos rastrear la causa real a venderle hardware que la oculte. En este caso la respuesta honesta fue: no amplíe el buffer pool, ordene las reglas.

Antes de comprar la ampliación, déjenos leer los números.

Si una máquina mayor lo arreglara, se lo diremos. Si solo ocultara la causa real, también lo diremos, con la medición.

Hable con un ingeniero

Ha 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
XIn

5 min restantes