Ich bin gerade dabei, einige Posgres Verbindungslecks in unserer Anwendung zu debuggen. Vor ein paar Tagen haben wir plötzlich 100 Verbindungen geknackt, als wir nicht sein sollten - denn wir haben nur 8 Einhornarbeiter und einen Sidekiq-Prozess (25 Threads).Große Anzahl von Threads unter Einhorn
Ich schaute heute auf htop und sah, dass eine Tonne Fäden von meinen Einhorn-Arbeitern hervorgebracht wurden. ZB:
Liest ich das richtig? Das sollte nicht richtig passieren? Wenn diese Threads erzeugt werden, irgendeine Idee, wie man das debuggt?
Danke! Btw, mein anderes Problem - (Postgres Verbindungen) Debugging unicorn postgres connection leak
EDIT
Ich folgte nur ein paar Tipps hier - http://varaneckas.com/blog/ruby-tracing-threads-unicorn/ - und wenn ich den Stack-Trace von den Gewinden Arbeiter gedruckt, hier ist, was ich habe wenn es viele Threads ..
[17176] ---
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `pop'
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `block in spawn_threadpool'
[17176] ---
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `pop'
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `block in spawn_threadpool'
[17176] ---
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `pop'
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `block in spawn_threadpool'
[17176] ---
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `pop'
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `block in spawn_threadpool'
[17176] ---
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `pop'
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `block in spawn_threadpool'
[17176] ---
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `pop'
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `block in spawn_threadpool'
[17176] ---
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `pop'
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `block in spawn_threadpool'
[17176] ---
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `pop'
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `block in spawn_threadpool'
[17176] ---
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `pop'
[17176] /u/apps/eventstream_production/shared/bundle/ruby/2.2.0/gems/eventmachine-1.0.8/lib/eventmachine.rb:1057:in `block in spawn_threadpool'
[17176] ---
[17176] -------------------
Das ist mein unicorn.rb https://gist.github.com/steverob/b83e41bb49d78f9aa32f79136df5af5f und es erzeugt einen Thread für eventmachine in after_fork.
Der Grund für diese ist eventmachine ->https://github.com/keenlabs/keen-gem#asynchronous-publishing
ist das normal? Sollten die Fäden nicht getötet werden? Könnte dies auch dazu führen, dass nicht benötigte db-Verbindungen geöffnet sind? Dank
UPDATE: ich gerade herausgefunden, dass ich eine ältere Version des PubNub gem bin mit der EM verwendet und ich lief in diese Zeilen in der pubnub.log Datei -
D, [2016-04-06T21:31:12.13#1573] DEBUG -- pubnub: Created event Pubnub::Publish
D, [2016-04-06T21:31:12.130144 #1573] DEBUG -- pubnub: Pubnub::SingleEvent#fire
D, [2016-04-06T21:31:12.130162 #1573] DEBUG -- pubnub: Pubnub::SingleEvent#fire | Adding event to async_events
D, [2016-04-06T21:31:12.130178 #1573] DEBUG -- pubnub: Pubnub::SingleEvent#fire | Starting railgun
D, [2016-04-06T21:31:12.130194 #1573] DEBUG -- pubnub: Pubnub::Client#start_event_machine | starting EM in new thread
D, [2016-04-06T21:31:12.130243 #1573] DEBUG -- pubnub: Pubnub::Client#start_event_machine | We aren't running on thin
D, [2016-04-06T21:31:12.130264 #1573] DEBUG -- pubnub: Pubnub::Client#start_event_machine | EM already running
Ich denke auch nicht, dass das normal ist. Vielleicht benutzen Sie 'Thread' in Ihrem Anwendungscode? Könnten Sie versuchen, das hier beschriebene Verfahren [http://vananeckas.com/blog/ruby-tracing-threads-unicorn/] zu verwenden, um Stack-Traces von den Einhorn-Threads zu erhalten (siehe insbesondere das _Was Ruby an einem beliebigen Punkt ausführt) Moment? _ Abschnitt)? Auf diese Weise können Sie herausfinden, wo die Threads verweilen. – BoraMa
Wow. Danke für diesen Link @BoraMa –
Ich denke, Sie haben 'reaper_frequency' in Ihrer' database.yml' konfiguriert, so dass der mittlere Thread der [Reaper thread] ist (https://github.com/rails/rails/blob/master/activerecord /lib/active_record/connection_adapters/abstract/connection_pool.rb#L300) und ich denke es ist normal. Wir sollten warten, bis sich die Fäden angesammelt haben ... – BoraMa