Пул соединений Rails 4.2.11.1 зависает при синхронизации - PullRequest
1 голос
/ 08 мая 2020

Наше приложение rails имеет версию 4.2, и мы периодически получаем исключение тайм-аута запроса (35 с). Мы использовали puma в качестве нашего сервера, и мы запускаем его с 8 потоками

Глядя на трассировку, кажется, что код пытается получить соединение из пула соединений

[GEM_ROOT]/gems/activerecord-4.2.11.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:262:in `connection'
260         # this is correctly done double-checked locking
261         # (ThreadSafe::Cache's lookups have volatile semantics)
262         @reserved_connections[current_connection_id] || synchronize do
263           @reserved_connections[current_connection_id] ||= checkout
264         end

и @reserved_connections[current_connection_id] на этом этапе равно нулю, поэтому он вызывает synchronize в строке 262.

и код в конечном итоге зависает на ruby 2.4.0 monitor class

/usr/local/lib/ruby/2.4.0/monitor.rb:187:in `lock'
185   def mon_enter
186     if @mon_owner != Thread.current
187       @mon_mutex.lock
188       @mon_owner = Thread.current
189       @mon_count = 0

^ завис в строке 187 и истекло время ожидания.

Я думал, что установка reaping_frequency поможет, но похоже, что это скорее проблема параллелизма, чем проблема плохого соединения.

Любая помощь / подсказка приветствуются.

...