2011-12-14 15 views
7

द्वारा बाधित नहीं किया जा रहा है। मुझे Google के माध्यम से जानकारी प्राप्त करने में बहुत भाग्य नहीं मिला है, शायद यहां किसी के पास एक समान समस्या है।हेरोकू पर धीमी पोस्टग्रेस क्वेरी को रैक-टाइमआउट

हमारे पास एक पोस्टग्रेस डीबी के साथ हेरोकू पर चलने वाला रेल ऐप है। हमारे पास विशेष रूप से धीमी क्वेरी है (हां, हम क्वेरी को ठीक करने पर काम कर रहे हैं), लेकिन इस समस्या को डीबग करने के दौरान, मैंने देखा कि हमारे रैक-टाइमआउट मणि 15 सेकंड में अनुरोध नहीं मार रहा है। मैंने नींद डालने के माध्यम से एक साइड-टेस्ट किया है (50) और यकीन है कि, उस मामले में रैक-टाइमआउट सही तरीके से काम कर रहा है।

यहां हमारे लॉग की एक प्रतिलिपि बनाई गई प्रतिलिपि है जो दिखाती है कि रैक-टाइम (टाइम अप!) कुछ मिनट बाद हो रहा है और हम अभी भी 30 सेकंड के बाद एच 12 अनुरोध टाइमआउट देख रहे हैं।

2011-12-14T21:15:16+00:00 app[web.2]: Started GET "/search?utf8=%E2%9C%93&terms=foo" for 173.164.186.205 at Wed Dec 14 13:15:16 -0800 2011 
    2011-12-14T21:15:16+00:00 app[web.2]: search query elapsed time => [0.000365018844604492] 
    2011-12-14T21:15:46+00:00 heroku[router]: Error H12 (Request timeout) -> GET /search dyno=web.2 queue= wait= service=30000ms status=503 bytes=0 
    2011-12-14T21:18:47+00:00 app[postgres]: [6-1] [removed] [COBALT] LOG: duration: 211241.725 ms statement: SELECT [truncated] 
    2011-12-14T21:18:47+00:00 app[web.2]: 
    2011-12-14T21:18:47+00:00 app[web.2]: ActionView::Template::Error (Timeout::Error: time's up!: SELECT [truncated]): 

रैक-टाइमआउट को क्यों और कैसे लागू किया जाए, इस बारे में कोई अंतर्दृष्टि?

उत्तर

4

हां, यहां क्या हो रहा है जो मैं ज़ोंबी डायनो कहता हूं। 30 सेकंड टाइमआउट रूटिंग जाल में ओकुरिंग है जो आपके डिनो से ऊपर बैठता है। सिद्धांत रूप में, आपका dyno घंटों तक चला सकता है, लेकिन उपयोगकर्ता सीधे रूटिंग जाल से 30 सेकंड के बाद एक त्रुटि दिखाई देगा।

तो। क्या हो रहा है यह है:

  1. आपका अनुरोध 21:15:16
  2. पर किया जाता है 21:15:46 पर मार्ग जाल रिटर्न यह त्रुटि है, लेकिन अपने dyno अभी भी
  3. 21:18:47 आपके अनुरोध खत्म पर संसाधित कर रहा है।

रैक :: टाइमआउट और आपकी लंबी चल रही क्वेरी के साथ क्या हो रहा है, यह शायद आपके द्वारा उपयोग किए जाने वाले पीजी मणि पर रैक :: टाइमआउट सही ढंग से कार्य करने के लिए धागे पर निर्भर है। यह बताता है कि डेटाबेस लौटने के पल में आपको टाइमआउट क्यों मिलता है।

अधिक ज़ोंबी dynos पर जानकारी: http://neilmiddleton.com/avoiding-zombie-dynos-with-heroku/

+0

प्रतिक्रिया के लिए धन्यवाद। जो मैं खोज रहा हूं वह इस बात का अंतर्दृष्टि है कि मैं अनुरोध को काटने के लिए रैक-टाइमआउट को कैसे मजबूर कर सकता हूं। हम heroku का उपयोग कर रहे हैं और हम pg_gem निर्दिष्ट नहीं करते हैं, heroku करता है। हम गैर-साझा डेटाबेस का उपयोग कर रहे हैं जो संस्करण 9.0.6 पर है। – sorens

+0

दुर्भाग्य से रैक टाइमआउट एक चल रही क्वेरी को मार नहीं सकता है। आपका आवेदन हेरोकू पर पीजी मणि का उपयोग करेगा क्योंकि यह स्लग संकलन प्रक्रिया द्वारा इंजेक्शन दिया गया है। –

1

postgres 9.2 तक बाहर आता है (जो एक बेहतर समय समाप्ति प्रणाली है), वहाँ रैक टाइमआउट मणि के साथ एक आसान समाधान नहीं है - postgres केवल चेक के बयान और के बीच संबंध रुकावट के लिए इस प्रकार रैक-टाइमआउट कुछ हद तक इस संबंध में सीमित है। इसके हाथ बंधे हैं ... यदि आपके पास पोस्टग्रेस तक सुपरसुर पहुंच थी तो आप कुछ कॉन्फ़िगरेशन ट्विक करने का प्रयास कर सकते हैं, लेकिन चूंकि आप उसकेोकू पर हैं, यह विकल्प नहीं है।

अपने डेटाबेस कॉल को अनुकूलित करने का प्रयास करें (सुनिश्चित करें कि आपके सभी इंडेक्स वहां हैं, आदि), या इस विशिष्ट मुद्दे के लिए अपने एकल कथन को छोटे हिस्सों में अलग करें (यह काउंटर-अंतर्ज्ञानी प्रतीत हो सकता है)।

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