Я занимаюсь отладкой некоторых утечек соединения Posgtres в нашем приложении. Несколько дней назад мы внезапно пересекли 100 соединений, хотя этого быть не должно, потому что у нас всего 8 рабочих-единорогов и процесс sidekiq (25 потоков).
Сегодня я просматривал htop и увидел, что мои рабочие-единороги порождают массу потоков. Например:
Я правильно понял? Этого не должно быть, верно? Если это порождаемые потоки, есть идеи, как это отлаживать?
Спасибо! Кстати, моя другая проблема - (соединения Postgres) Отладка утечки соединения unicorn postgres
ИЗМЕНИТЬ
Я просто следовал некоторым советам здесь - http://varaneckas.com/blog/ruby-tracing-threads-unicorn/ — и когда я напечатал трассировку стека из рабочих потоков, вот что я получил, когда потоков много..
[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] -------------------
Это мой unicorn.rb https://gist.github.com/steverob/b83e41bb49d78f9aa32f79136df5af5f и он порождает поток для EventMachine в after_fork.
Причина для EventMachine заключается в следующем --> https://github.com/keenlabs/keen-gem#asynchronous-publishing
Это нормально? Разве темы не должны быть убиты? Может ли это также вызывать открытие ненужных соединений с базой данных? Спасибо
ОБНОВЛЕНИЕ: я только что узнал, что использую более старую версию драгоценного камня PubNub, который использует EM, и я столкнулся с этими строками в файле pubnub.log:
D, [2016-04-06T21:31:12.130123 #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
Thread
s в коде своего приложения? Не могли бы вы попробовать использовать процедуру, описанную здесь, чтобы получить трассировку стека из unicorn threads (особенно см. раздел Что Ruby делает в данный момент?)? Таким образом, вы можете найти, где задерживаются нити. - person BoraMa   schedule 08.04.2016reaper_frequency
в своемdatabase.yml
так, чтобы средний поток был Reaper thread и я думаю, что это нормально. Надо подождать, пока нити соберутся... - person BoraMa   schedule 08.04.2016