2014-07-08 8 views
12

Ambiente:casuale lento Rack :: MethodOverride # chiamata su rotaie app sul Heroku

  • Rubino: 2.1.2

  • Rails: 4.1.4

  • Heroku

Nella nostra app di rotaie ospitata su Heroku, ci sono momenti in cui le richieste richiedono molto tempo per essere eseguite. È solo l'1% di volte o meno, ma non riusciamo a capire cosa sta succedendo.

Abbiamo installato l'agente newrelic e si dice che non è la coda di richiesta, è la transazione stessa che impiega tutto quel tempo per l'esecuzione.

Tuttavia, tracce delle transazioni mostra questo:

enter image description here

(questa stessa richiesta il più delle volte richiede solo 100 ms per essere eseguito)

Per quanto posso dire, il tempo è essere consumato prima che il nostro controller venga richiamato. E 'consumato il

Rack::MethodOverride#call 

e questo è ciò che non possiamo capire.

Inoltre, la maggior parte delle volte (o anche sempre, non siamo sicuri) questo accade sulle richieste POST inviate dai dispositivi mobili. Questo potrebbe avere qualcosa a che fare con una connessione lenta? (anche se il POST-payload è molto piccolo).

Qualcuno ha provato questo? Qualsiasi consiglio su come continuare ad esplorare questo problema è apprezzato.

Grazie in anticipo!

risposta

7

Poiché l'agente Ruby ha iniziato a utilizzare il middleware dello strumento nella versione 3.9.0.229, abbiamo riscontrato che questa domanda si pone per alcuni utenti. Una possibile causa dei tempi più lunghi è che Rack :: MethodOverride ha bisogno di esaminare il corpo della richiesta su POST per determinare se i parametri POST contengono una sovrascrittura del metodo. Chiama Rack::Request#POST, che termina con l'attivazione di una lettura pari a reads in the entire request body.

Questo potrebbe essere il motivo per cui si vede che è trascorso più tempo del previsto in questo middleware. Uno sguardo più approfondito su come il corpo del POST si rapporta al tempo trascorso nel middleware potrebbe essere una strada fruttuosa per le indagini.

+1

Grazie mille per la rapida risposta! Un'altra domanda se la conosci anche tu: a quel punto, il corpo della richiesta è già nella memoria di Dyno? oppure, il corpo della richiesta di lettura potrebbe essere interessato dalla connessione del client. Voglio dire, se la connessione del client è lenta, può essere questa la ragione per cui ci vuole così tanto tempo per leggere il corpo della richiesta? – alex

2

Nel caso qualcuno sta vivendo questo:

Infine abbiamo fatto il passaggio da unicorn al passeggero e questo problema è stato risolto:

https://github.com/phusion/passenger-ruby-heroku-demo

non sono sicuro, ma il problema può avere qualcosa a che fare con le richieste POST sui client lenti.Passeggeri/nginx dice:

richiesta/risposta buffer - I buffer inclusi richieste di Nginx e risposte, proteggendo in tal modo la vostra applicazione contro i client lenti (ad esempio mobili dispositivi su reti mobili) e migliorando le prestazioni.

Quindi questo potrebbe essere il motivo.

+0

Ho risolto questo problema usando nginx di fronte ai nostri lavoratori di unicorno. Siamo su heroku, quindi ho usato questo buildpack qui: https://github.com/ryandotsmith/nginx-buildpack –

Problemi correlati