लॉन्ग रनिंग एडमिन पेज रिक्वेस्ट अन्य रिक्वेस्ट को ब्लॉक करना


17

यदि मैं Magento के बैकएंड में लॉग इन हूं और कुछ कार्य करता हूं जो लंबे समय (बड़ी कैटलॉग पर वैश्विक खोज, लंबे समय तक चलने वाला डेटाफ़्लो, आदि) करता है, तो मेरा वेब ब्राउज़र केवल उस ब्राउज़र में अन्य व्यवस्थापक पृष्ठों को लोड करने से इनकार करेगा । ऐसा क्यों होता है, और क्या वर्कअराउंड के लिए कोई ज्ञात विज्ञान है?

यानी अगर मैं

  1. Magento के डैशबोर्ड पेज में लॉग इन करें

  2. किसी भी Magento व्यवस्थापक पृष्ठ के साथ एक दूसरा टैब खोलें

  3. एक लंबे चल वैश्विक खोज (के लिए एक कॉल के साथ नकली प्रदर्शन sleep(30)के शुरू में globalSearchActionपहला टैब में)

  4. दूसरे टैब को फिर से लोड करने का प्रयास

अपेक्षित व्यवहार: पृष्ठ सामग्री के साथ तुरंत दूसरा टैब लोड होता है

वास्तविक व्यवहार: लंबे समय तक चलने वाली वैश्विक खोज पूरी होने के बाद दूसरा टैब केवल लोड होता है

क्या किसी को पता है, विशेष रूप से, ऐसा क्यों होता है? (मेरा अनुमान है कि Magento एडमिन कंसोल कुछ संसाधनों को लॉक करने के लिए अनुरोध करता है Magento बूटस्ट्रैप की आवश्यकता है, लेकिन मुझे नहीं पता कि वह क्या है)

क्या किसी को एक फिक्स / वर्कअराउंड का पता है?


1
आप, श्रीमान, मुझे एक चुनौती पर भेजा है! :)
डेवडाइगर

जवाबों:


21

समस्या PHP सत्र हैंडलर द्वारा रखे गए लॉक के कारण होती है। तो यह मैगेंटो स्पष्ट रूप से कुछ लॉक नहीं कर रहा है और व्यवस्थापक अनुरोधों को अवरुद्ध करने की कोशिश कर रहा है, लेकिन फ़ाइल-आधारित सत्र भंडारण के लगभग एक साइड-प्रति-प्रभाव।

प्रारंभिक (लंबे समय तक चलने वाले) अनुरोध के द्वारा खोले जाने पर सत्र डेटा फ़ाइल पर एक राइट लॉक रखा जा रहा है, जिससे कॉल जारी होने तक लॉक जारी होने तक दूसरा अनुरोध अवरुद्ध हो जाता है session_startMage_Core_Model_Session_Abstract_Varien::start

यह 100% प्रजनन योग्य है। मैंने उसी विधि का उपयोग किया, जिसमें आप sleep(30)शीर्ष पर थेMage_Adminhtml_IndexController::globalSearchAction

यदि आप डीबी सत्र भंडारण का उपयोग कर रहे हैं तो वर्थ नोटिंग यह पुन: प्रस्तुत नहीं किया जा सकता है। मुझे मूल कारण का पता चलने के बाद, मैंने एक सैंडबॉक्स को db सेशन स्टोरेज में सेट किया और अब इस मुद्दे को पुन: पेश नहीं कर सका। तो db सेशन हैंडलर्स Magento ने प्रतीत होता है कि रो-सेशन लॉक टू सेशन लिखने के लिए रो-लेवल लॉकिंग का इस्तेमाल नहीं करते हैं। मुझे यह दिलचस्प लगता है, क्योंकि इसमें सत्र डेटा हानि की संभावना है क्योंकि आवेदन स्पष्ट रूप से एक ही सत्र के लिए कई सूत्र लिखने के लिए लेखांकन नहीं है। पाठकों के लिए ध्यान दें: मैं कोशिश करने और इसे हल करने के लिए उत्पादन में db सत्र भंडारण का उपयोग कभी नहीं करूंगा, यह केवल आपके MySql डेटाबेस को ओवरलोड करने के लिए अच्छा है।

मैंने मेमोरी आधारित सत्र भंडारण प्रणालियों जैसे कि रेडिस का उपयोग करके व्यवहार को पुन: प्रस्तुत करने की कोशिश नहीं की, लेकिन मेरा अनुमान है कि सत्र की दुकान में रिकॉर्ड को लॉक करना शायद इन के रूप में अच्छी तरह से अनदेखी की गई थी।

ऐसी तकनीकें हैं जिन्हें इससे बचने के लिए नियोजित किया जा सकता है जैसे session_write_closeकि लंबे समय तक काम करने से पहले ताला खोलने का उपयोग करें। लेकिन यह आपको सत्र को लिखने से भी रोकेगा क्योंकि आपने अभी इसे बंद किया है। इसलिए इसे मैगेंटो में पूरे बोर्ड में आसानी से लागू किए जाने की संभावना नहीं है, लेकिन संभवतः इसे विशिष्ट मार्गों / नियंत्रकों पर लागू किया जा सकता है।

मूल कारण के रूप में इसे पिन करने की मेरी तकनीक Xdebug प्रोफाइलर को सक्षम करने और "कैशग्रिंड" फ़ाइल की जांच करने के लिए थी। एक बार जब दूसरा अनुरोध पूरा हो जाता है, तो मैंने आउटपुट फ़ाइल (~ 25 एमबी लॉग) को MacCallGrind में लोड किया और कॉल के पथ के बाद ट्रेस में नीचे गिरा दिया जहां समावेशी समय 28 सेकंड या उससे अधिक था। इसने अंततः मुझे session_startकॉल करने के लिए प्रेरित किया, जिसे चलाने के लिए ~ 28 सेकंड का समय लगा, जिससे मुझे अनुसंधान के लिए एक शानदार बिंदु मिला।

संपादित करें: रुचि के लिए, मैंने ट्विटर पर MacCallGrind में देखी गई "cachegrind" फ़ाइल का स्क्रीनशॉट पोस्ट किया है


Unirgy का uRapidFlow मॉड्यूल इस मुद्दे से बचने के लिए सत्र को बंद कर देता है, जो एक तरह से अच्छा है, लेकिन यह उतना ही निराशाजनक है जितना कि उपयोगकर्ता को फीडबैक प्रदान करना मुश्किल हो जाता है।
पीटर ओ'कालाघन

@davidalger - आप आमतौर पर ग्राहक साइटों के लिए किस सत्र का भंडारण करते हैं?
एलन स्टॉर्म

3
पुन: PHP सत्र फ़ाइल को लॉक करना, यह डेटा अखंडता के लिए कम है क्योंकि यह फ़ाइल-ऑन-डिस्क की अखंडता के लिए है। डिस्क पर बिट्स को खोलने और लिखने की कई प्रक्रियाएं होने (जो कि एक फ़ाइल है) से डेटा का भ्रष्टाचार जल्दी होगा। MySQL, redis, और अधिकांश डेटाबेस को विशेष रूप से सुसंगत रहने के लिए डिज़ाइन किया गया है, भले ही लगभग एक ही समय में एकाधिक लिखते हों। यानी ऐसा नहीं है कि लॉकिंग को नजरअंदाज कर दिया गया था, यह है कि यह समीक्षकों की जरूरत नहीं है।
एलन स्टॉर्म

@AlanStorm - एक लोड-संतुलित इंस्टॉलेशन के लिए एक समर्पित मेमकास्टेड उदाहरण, एकल एप्लिकेशन नोड क्लस्टर के लिए फ़ाइल-सिस्टम। फ़ाइल-सिस्टम सबसे अच्छा प्रदर्शन करता है जहाँ आपके पास कई नोड नहीं हैं क्योंकि आपके पास कोई आईपी विलंबता नहीं है।
डेविडलगर

सही है, फ़ाइल को लॉक करना डेटा के भ्रष्टाचार को रोकने के बारे में है। हालाँकि, सत्र बंद होने तक लॉक को रोकना डेटा हानि को रोकने के बारे में है। यदि दो प्रक्रियाएँ सत्र डेटा को लोड करती हैं, तो इसे संशोधित करें और फिर इसे लिखें, उनमें से एक में यह ओवरराइट किया गया है। आम तौर पर एक महत्वपूर्ण समस्या का सामना करने के लिए नहीं जा रहा है, लेकिन समस्याओं को दूर करने के लिए डेटा हानि और / या बुरा मुश्किल पैदा कर सकता है।
डेविडलगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.