2016-04-11 14 views
5

私はSidekqの労働者の問題にぶつかっています。Rails接続プールの使用方法をデバッグするには?

ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds) 

ActiveRecord::ConnectionTimeoutErrorと適切に大きな接続プールの使用についての推奨事項は次のとおりです。

私は接続プールを使い果たしているかどうか調べたいと思います。私はsizeconnections.lengthActiveRecord::Base.connection_poolからログに記録していますが、一定のサイズ= 100 connections.length = 5のままです。これはリソースリークの問題ではないことを示しています。

MySQLサーバは、最大400の同時接続を許可するように設定されています。

私の仕事はこのように見てしまった:

class MyJob < ActiveJob::Base 
    queue_as :default  
    rescue_from StandardError do |exception| 
    # clear connections on exception. Not sure if this is a good idea or not. 
    ActiveRecord::Base.clear_active_connections!  
    end 

    def perform() 
    logger.info "size" 
    logger.info ActiveRecord::Base.connection_pool.instance_eval { @size } 
    logger.info "connections" 
    logger.info ActiveRecord::Base.connection_pool.instance_eval { @connections }.length 

    # Ensure connections come from connection pool. 
    ActiveRecord::Base.connection_pool.with_connection do |conn| 
     # do stuff 
    end 
    end 
end 

は、これは資源の枯渇や漏れのかどうか、これを引き起こしているものを診断する正しい方法ですか?なぜこれが起こっているのかを理解するために使用できる他のテクニックはありますか?

+0

'database.yml'で定義されている接続プールのサイズはどれくらいですか?いくつのsidekiqワーカースレッドを使用しますか? – BoraMa

+0

プールは、connection_pool.size、25人の作業者に示すように、100として定義されています。 – Joe

答えて

2

このActiveRecord::ConnectionTimeoutErrorは私の意見では唯一のシナリオで発生する可能性があります - プールが使い果たされること DB接続を使用したいとsource codeから学んだとしても、(助けない自由な接続を待ってので、多くのスレッドがある場合)。

あなたの場合、それは変です。 25のワーカースレッドしか使用しませんが、プールは100の接続に設定されているため、十分な予約があります。私はまだあなたがどこかに産卵するスレッドを持っていなければならないと思っています。おそらく、あなたはあなたの仕事に糸を引くでしょうか?おそらくあなたの仕事にスレッドを作成する宝石を使用しますか?とにかく

、あなたは例外を再現することができれば、私はそれをキャッチし、それが発生した瞬間に、すべてのスレッドの一覧を取得し、このような何かすることをお勧め:

begin 
    # job stuff...  
rescue ActiveRecord::ConnectionTimeoutError 
    puts "listing #{Thread.list.count} threads:" 
    Thread.list.each_with_index do |t,i| 
    puts "---- thread #{i}: #{t.inspect}" 
    puts t.backtrace.take(5) 
    end 
end 

私はそこに期待100以上のスレッドを使用している場合は、正確にバックトレースからスタックされている場所を確認する必要があります。

+0

華麗な感謝。私はそれを試みます。私は自分でスレッドを回転させるのではなく、他のライブラリが何をしているのかを知っています。 – Joe

+0

あなたはまだ何かを見つけましたか? – BoraMa

+1

いいえ。私はサイドキック作業員の数を減らし、エラーはありません。これは長期的な調査リストに掲載されています。確認してくれてありがとう。 – Joe

関連する問題