sql >> Base de Datos >  >> RDS >> Mysql

¿Cuáles son los límites de conexión para Google Cloud SQL de App Engine y cuál es la mejor manera de reutilizar las conexiones de bases de datos?

Respuesta corta:sus consultas probablemente sean demasiado lentas y el servidor mysql no tiene suficientes subprocesos para procesar todas las solicitudes que intenta enviar.

Respuesta larga:

Como antecedente, Cloud SQL tiene dos límites que son relevantes aquí:

  • Conexiones:Corresponden al objeto 'conn' en su código. Hay una estructura de datos correspondiente en el servidor. Una vez que tenga demasiados de estos objetos (actualmente configurados en 1000), los menos utilizados recientemente se cerrarán automáticamente. Cuando una conexión se cierra debajo de ti, obtendrás un error de conexión desconocido (ApplicationError:1007) la próxima vez que intentes usar esa conexión.
  • Solicitudes simultáneas:son consultas que se ejecutan en el servidor. Cada consulta en ejecución vincula un hilo en el servidor, por lo que hay un límite de 100. Cuando hay demasiadas solicitudes simultáneas, las solicitudes posteriores se rechazarán con el error que está recibiendo (ApplicationError:1033)

No parece que el límite de conexión te esté afectando, pero quería mencionarlo por si acaso.

Cuando se trata de solicitudes concurrentes, aumentar el límite puede ayudar, pero generalmente empeora el problema. Hay dos casos que hemos visto en el pasado:

  • Bloqueo:una consulta de ejecución prolongada está bloqueando una fila crítica de la base de datos. Todas las consultas posteriores se bloquean en ese candado. La aplicación se agota en esas consultas, pero siguen ejecutándose en el servidor, vinculando esos hilos hasta que tiempo de espera de interbloqueo disparadores.
  • Consultas lentas:cada consulta es muy, muy lenta. Esto suele ocurrir cuando la consulta requiere una clasificación de archivo temporal. La aplicación agota el tiempo de espera y vuelve a intentar la consulta mientras el primer intento de la consulta aún se está ejecutando y cuenta contra el límite de solicitudes simultáneas. Si puede encontrar su tiempo de consulta promedio, puede obtener una estimación de cuántas QPS puede admitir su instancia de mysql (por ejemplo, 5 ms por consulta significa 200 QPS para cada hilo. Como hay 100 hilos, podría hacer 20,000 QPS. 50 ms por consulta significa 2000 QPS).

Debe usar EXPLAIN y MOSTRAR ESTADO INNODB DEL MOTOR para ver cuál de los dos problemas está pasando.

Por supuesto, también es posible que solo esté generando una gran cantidad de tráfico en su instancia y simplemente no haya suficientes subprocesos. En ese caso, probablemente estará maximizando la CPU para la instancia de todos modos, por lo que agregar más subprocesos no ayudará.