Наше приложение 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
поможет, но похоже, что это скорее проблема параллелизма, чем проблема плохого соединения.
Любая помощь / подсказка приветствуются.