2011-01-31 7 views
6

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

enter image description here

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!

Respuesta

4

Me di cuenta - Tenía un parámetro de configuración de SAVE en Redis que se activaba una vez por minuto. Evidentemente, las operaciones de bifurcación/guardado de redis están bloqueando mi aplicación. Cambio el parámetro config para que sea "3600 1", lo que significa que solo guardo mi base de datos una vez por hora, lo cual está bien porque la estoy usando como un caché (los datos persisten en MYSQL).

+0

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

+0

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

0

Para responder a su pregunta original, es posible obtener "todos los rastros de pila" para los procesos ruby ​​en ejecución que pasa el pasajero. Básicamente enviar el mensaje SIGQUIT a cada uno, y que van a escupir todas sus trazas en el archivo de registro de Apache/nginx, por ejemplo:

https://gist.github.com/rdp/905759f88134229c2969b9f242188615

Cuestiones relacionadas