2016-04-29 6 views
0

Newrelic sagt Rack::Lock#call dauert etwa 9 Sekunden.Rack :: Lock # Anruf zu viel Zeit

Siehe unten Snapshot:

http://prntscr.com/ay7ccx

Wir haben folgende Serverkonfiguration

  • Ubuntu 14.04 64 bit
  • Puma mit 2 Arbeiter, 1 bis 6 max Gewinde
  • Nginx als Frontend
  • Rails 4 und Ruby 2
  • 7 GB RAM und 4-Kern-CPU

Kann jemand helfen, warum es in Middleware so viel Zeit in Anspruch nimmt?

Antwort

0

Das klingt wie der Multithread-Modus von Rails. Dies fügt die Rack::Lock Middleware hinzu, die wiederum einen Mutex verwendet, um sicherzustellen, dass jede Rails-Instanz eine Anfrage nach der anderen bearbeitet. Die Zahlen, die Sie sehen, zeigen, dass dies dazu führt, dass Anfragen innerhalb Ihrer Rails-Instanz anstehen.

Dies ist ein Controller mit der Einstellung allow_concurency, die standardmäßig auf false gesetzt ist.

Als eine Nebenbemerkung, MRI ist nicht gut in der Zuverlässigkeit (wenn Sie cpu gebunden sind) - Sie können besser mehr Arbeiter mit weniger Threads laufen. Du könntest auch zu jruby wechseln (das kein GIL hat), aber das ist offensichtlich ein größeres Unterfangen.

+0

2 Arbeiter und 6 Threads wird genug sein, wenn ich 'allow_concurrency' zu true aktivieren? – GBD

+0

Das hängt ganz von Ihrer Anwendung ab, von der Auslastung und davon, ob Sie CPU-gebunden sind oder nicht. –