2016-04-11 25 views
5

Sidekiq çalışanları ile sorunlara koşuyorum.Rails bağlantı havuzu kullanımı nasıl hata ayıklanır?

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

Ben ActiveRecord::ConnectionTimeoutError ve uygun genişlikte bağlantı havuzu kullanma hakkında öneriler takip ediyorum.

Bağlantı havuzunu yoruyor muyum? size ve connections.length oturumunu ActiveRecord::Base.connection_pool'dan yapıyorum, ancak sabit bir boyutta kalıyorlar = 100 bağlantı.length = 5. Bu bir kaynak sızıntısı sorunu olmadığını gösteriyor.

MySQL sunucum 400 eşzamanlı bağlantıya izin verecek şekilde yapılandırıldı. o kaynak açlık veya kaçak olsun,

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 

bu bunun ne teşhis etmek doğru yolu mu:

My Job bu gibi bakarak sona erdi? Bunun neden olduğunu anlamak için kullanabileceğim başka teknikler var mı?

+0

'database.yml' dosyasında tanımlanan bağlantı havuzunun boyutu nedir? Kaç sidekiq çalışan iş parçacığı kullanıyorsunuz? – BoraMa

+0

Havuz, connection_pool.size'de gösterildiği gibi, 25 işçi olarak 100 olarak tanımlanmıştır. – Joe

cevap

2

Bu ActiveRecord::ConnectionTimeoutError Bence tek senaryoda ortaya çıkabilir - Havuz bitkin olduğunu DB bağlantılarını kullanmak isteyen ve source code öğrenilen bile (yardımcı olmuyor ücretsiz bağlantı için bekleyen kadar çok konu varken).

Sizin durumunuzda, bu garip. Sadece 25 çalışan iş parçacığı kullanıyorsunuz, ancak havuz 100 bağlantıya ayarlanmış, bu yüzden bol miktarda yedek var. Hala bir yerlerde üreme olan bir konu olması gerektiğinden şüpheleniyorum. Belki de işinizde biraz iş yapıyorsunuz? Belki işinizde iş parçacığı oluşturan bir mücevher kullanıyorsunuz? Ben orada olur

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 

: Eğer istisna çoğaltmak mümkün ise

Neyse, ben, böyle bir şey yakalamak ve onu meydana anda tüm iş parçacığı listesini elde etmek için öneririm 100 veya daha fazla iş parçacığı ve backtrace'den tam olarak nerede sıkıştıklarını görmelisiniz.

+0

Mükemmel teşekkürler. Bunu deneyeceğim. Herhangi bir konuya kendimi eğmiyorum ama kim bilir başka kütüphanelerin neler yaptığını biliyor! – Joe

+0

Henüz bir şey buldunuz mu? – BoraMa

+1

Hayır. Sidekiq çalışanlarının sayısını azaltdım ve hiç hatam yok. Bu uzun vadeli soruşturma listesinde gidiyor. Kontrol ettiğin için teşekkürler. – Joe