Tengo una aplicación de producción de sinatra de rubí que se ejecuta en nginx/pasajero, y con frecuencia veo que las solicitudes se estancan inexplicablemente. Escribí un script para llamar al estado de pasajero en mi grupo de máquinas cada diez segundos y trazar los resultados en un gráfico. Esto es lo que veo:Cómo obtener un seguimiento de pila en todos los subprocesos de ruby en pasajero
La línea azul muestra la cola de espera global de clavar constantemente a 60. Se trata de un medio a través de 4 máquinas, por lo que cuando la línea azul golpea 60, significa que cada máquina está al máximo fuera. Tengo el valor actual de passenger_max_pool_size establecido en 20, por lo que se llega a 3 veces el tamaño máximo de la agrupación y, luego, prescindiendo de las solicitudes posteriores.
Mi aplicación depende de dos recursos externos clave: un backend de Amazon RDS mysql y una instancia de Redis. ¿Quizás uno de estos periódicamente se está volviendo lento o no responde y por lo tanto está causando este comportamiento?
¿Alguien me puede aconsejar sobre cómo obtener un seguimiento de pila para ver si el cuello de botella aquí es Amazon RDS, Redis u otra cosa?
Gracias!
puedo saber cuánto tiempo fue la espera? AFAIK, el guardado automático debe estar en segundo plano y solo debe retrasarse mientras se copian las páginas de memoria, que deben estar a 300 ms arriba. – seppo0010
Empíricamente, parece que mi nodo redis se bloqueará durante varios segundos, diría que vi alrededor de 5 -10 segundos de bloqueo en cualquier período dado de 60 segundos. Voy a tratar de hacer girar un esclavo y usar el esclavo para salvar. – esilver