2011-11-24 16 views
5

Jestem w trakcie ulepszania starej aplikacji Rails i PostgreSQL od 2.1 do Rails 3 (poprzez udany etap pośredni 2.3.11).Jednorożec! i PostgreSQL

W końcu, gdy wszystkie Rspecy działały sprawnie, zainstalowałem Mongrel 1.2.0.pre2 i uruchomiłem - wszystko w porządku. Nawet test JMeter z 100 równoczesnymi użytkownikami przeszedł OK.

Ale kiedy spróbowałem tego samego z Unicornem! serwer, działa dobrze, gdy sam go używam, ale kiedy dostaję go pod obciążeniem za pomocą JMetera, zaczyna dawać 100% błędów od momentu, w którym JMeter próbuje POST zalogować. W tym samym czasie, gdy sprawdzam jakąś konkretną stronę, daje mi dziwne błędy tak:

undefined method `eq' for nil:NilClass 

na terminalu pojawia się następujący komunikat (ale tylko kilka razy):

message type 0x43 arrived from server while idle 
message type 0x5a arrived from server while idle 
WARNING: there is already a transaction in progress 

EDIT: to wydaje się być problem ze wspólną PGconnect obiektu, więc usunąłem niektóre z poprzedniego tekstu

stwierdziliśmy, że PostgreSQL docs określić, że PGconn obiekt nie muszą być udostępniane między wątkami wysyłającymi współbieżne żądania.

To jednorożec! lub żądania mieszania AR z różnych wątków w tym samym obiekcie PGconn?

database.yml:

production: 
    adapter: postgresql 
    encoding: unicode 
    database: *** 
    username: *** 
    password: *** 
    host: 127.0.0.1 

Próbowałem nawet dodać to bezskutecznie:

allow_concurrency: true 

unicorn.conf:

worker_processes 8 
working_directory "/full/path/to/app" 
listen '/tmp/app.sock', :backlog => 512 
timeout 30 
pid "/full/path/to/app/tmp/pids/puppetmaster_unicorn.pid" 

preload_app true 
    if GC.respond_to?(:copy_on_write_friendly=) 
    GC.copy_on_write_friendly = true 
end 

Specyfikacja:

  • Rails 3.0.6 (z powodu wdrożenia env)
  • Jednorożec! 4.1.1
  • Nginx 1.0.5
  • pg gem 0.11.0
  • PostgreSQL 9.0.4
  • Mac OS X 10.7.2

Jeśli Rails wersja powinna być winowajcą, oczywiście Mogę uaktualnić do najnowszego. Właśnie zacząłem od tego, co ma usługodawca.

+0

Ile jednorożec pracownicy mają utworzyć w unicorn.rb? Jaki limit czasu? – stephenmurdoch

+0

Zaktualizowałem moje pytanie z unicorn.conf – Laas

Odpowiedz

7

Bardzo ważne jest, aby nie współużytkować połączeń z bazami danych między procesami. Po uruchomieniu Railsów z preload_app Railsy nawiążą połączenia AR, zanim mistrz jednorożca rozwinie pracowników. Przykład unicorn.conf.rb ma zalecenie, aby odłączyć połączenie AR w haku before_fork. AR automatycznie przywróci nowe połączenie, ponieważ każdy pracownik wymaga go po rozwidleniu.

fragment http://unicorn.bogomips.org/examples/unicorn.conf.rb:

before_fork do |server, worker| 
    # the following is highly recomended for Rails + "preload_app true" 
    # as there's no need for the master process to hold a connection 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 
    # ... 
end 
+0

Tak, dowiedziałem się o tym również z pomocą listy mailingowej Unicorn, ale zapomniałem zaktualizować moją odpowiedź. Nadaję ci punkty za robienie tego za mnie. Dziękuję Ci. – Laas