2016-04-11 7 views
5

मैं साइडकीक श्रमिकों के साथ मुद्दों में भाग रहा हूं।रेल कनेक्शन पूल उपयोग को डीबग कैसे करें?

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

मैं ActiveRecord::ConnectionTimeoutError और एक उपयुक्त बड़े कनेक्शन पूल का उपयोग कर के बारे में सिफारिशों के बाद कर रहा हूँ।

मैं यह जानना चाहता हूं कि मैं कनेक्शन पूल को समाप्त कर रहा हूं या नहीं। मैं size और connections.lengthActiveRecord::Base.connection_pool से लॉगिंग कर रहा हूं, लेकिन वे निरंतर आकार = 100 कनेक्शन। 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' में परिभाषित कनेक्शन पूल का आकार क्या है? आप कितने साइडकीक वर्कर थ्रेड का उपयोग करते हैं? – BoraMa

+0

पूल को 100 के रूप में परिभाषित किया गया है, जैसा कि कनेक्शन_पूल.size, 25 श्रमिकों में दिखाया गया है। – Joe

उत्तर

2

यह ActiveRecord::ConnectionTimeoutError मेरी राय में केवल एक ही स्थिति में हो सकता है - जब वहाँ इतने सारे धागे डीबी कनेक्शन का उपयोग करने के लिए है कि पूल समाप्त होने के लिए इच्छुक और यहां तक ​​कि एक नि: शुल्क कनेक्शन मदद नहीं करता है के लिए इंतज़ार कर (के रूप में 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

संबंधित मुद्दे