2015-07-23 15 views
15

Sto utilizzando Unicorn come app server per la mia app Rails e sto cercando di capire perché a volte a volte un ritardo non banale (> 5 secondi) tra l'inizio di una richiesta e quando raggiunge il mio controller.Rails Unicorn - Ritardo tra la richiesta iniziale e il controllore in arrivo

Questo è ciò che i miei production.log stampe fuori:

Started GET "/search/articles.json?q=mashable.com" for 138.7.7.33 at 2015-07-23 14:59:19 -0400** 
    Parameters: {"q"=>"mashable.com"} 

Searching articles for keyword: mashable.com, format: json, Time: 2015-07-23 14:59:26 -0400 

Avviso come ci sia un secondo di ritardo 7 tra iniziare: e "Ricerca articoli per parole chiave", che è la prima cosa che il metodo di controllo lo fa.

articles.json viene indirizzato al mio controller metodo "articoli" che si limita a questo, per ora:

def articles 
     format = params[:format] 
     keyword = params["q"] 

     Rails.logger.info "Searching articles for keyword: #{keyword}, format: #{format}, Time: #{Time.now.to_s}" 

end 

Questo è il mio routes.rb

MyApp::Application.routes.draw do 
    match '/search/articles' => 'search#articles' 
    #more routes here, but articles is the first route 
end 

Che cosa potrebbe causare questo ritardo? È perché un lavoratore Unicorn è occupato? È perché un lavoratore Unicorn sta prendendo troppa memoria che porta il sistema a essere lento?

Nota: non credo che il ritardo sia nel creare connessioni al database, ma potrei sbagliarmi. Il codice non ha bisogno di effettuare una chiamata al database, e le connessioni massime per il mio database sono 1000, e generalmente ci sono al massimo 1-2 connessioni.

+2

potrebbe essere una miriade di ragioni - è necessario monitorare le risorse di sistema, nonché unicorno. Se nulla è a posto, aggiungere un agente newrelic potrebbe essere l'opzione più rapida/semplice –

+0

Sta succedendo anche con Puma, Passenger ecc? – adamliesko

+0

Che cosa dice l'ultima riga della richiesta GET, cioè quella che sais 'Completato 200 OK in 100 ms (Visualizzazioni: 50.0ms | ActiveRecord: 50.0ms) ' – amiuhle

risposta

4

Penso che possa essere a causa della mancanza di memoria e quindi della raccolta dei rifiuti frequente, che congela l'intero sistema.

+0

Unicorn utilizza solo il 15% della memoria totale, quindi dubito che sia lo –

12

Tre pensieri:

  1. probabilmente sarete meglio serviti con Puma, invece di Unicorn

  2. Potrebbe essere che il sistema è a corto di memoria, o potrebbe avere un sacco di memoria disponibile: installa New Relic per risolvere il punto in cui il collo di bottiglia è

  3. Potrebbe anche essere che tu abbia più istanze Unicorn rispetto al numero di connessioni consentito dal DB, nel qual caso l'istanza deve far sì che gli altri si disconnettano prima che possa connettersi. Questo probabilmente si manifesterebbe con ritardi irregolari di 5 secondi piuttosto che ogni volta.

+0

Ma non ci sono connessioni al database tra "STARTED GET" e la prima dichiarazione del log che viene stampata. Nessun lavoro significativo si verifica. –

+0

In realtà ActiveRecord (e quindi Rails) gestisce questo automaticamente e spool solo su una connessione DB sulla prima query SQL, che è esattamente quando si verifica il problema. Maggiori informazioni su questo qui: https://devcenter.heroku.com/articles/concurrency-and-database-connections#connection-pool. Poiché stai utilizzando Unicorn, hai molte istanze in esecuzione e se questo # è maggiore del numero di connessioni che il DB consentirà, un processo disconnesso dovrà attendere che gli altri si disconnettano una volta che ha inviato la sua prima query SQL. – tyler

3

Se si tratta di un problema di produzione, potrebbe essere causato da client lenti che inviano richieste. New Relic and Monit sono buone opzioni. Potresti prendere in considerazione l'invio di segnali agli operatori Unicorn per riavviarli per capire meglio il problema.

Si potrebbe anche provare ad aggiungere preload_app true nella configurazione di Unicorn per accelerare il tempo di avvio dei processi di lavoro.

+0

In che modo i client possono rallentare questo problema? –

+0

Alcune buone informazioni qui: http://www.smashcompany.com/technology/if-unix-is-good-for-unicorn-why-cant-unicorn-handle-slow-connections – CJW

7

In realtà, potrebbe essere causato da un callback before_filter, si dovrebbe verificare

Problemi correlati