समस्या PHP सत्र हैंडलर द्वारा रखे गए लॉक के कारण होती है। तो यह मैगेंटो स्पष्ट रूप से कुछ लॉक नहीं कर रहा है और व्यवस्थापक अनुरोधों को अवरुद्ध करने की कोशिश कर रहा है, लेकिन फ़ाइल-आधारित सत्र भंडारण के लगभग एक साइड-प्रति-प्रभाव।
प्रारंभिक (लंबे समय तक चलने वाले) अनुरोध के द्वारा खोले जाने पर सत्र डेटा फ़ाइल पर एक राइट लॉक रखा जा रहा है, जिससे कॉल जारी होने तक लॉक जारी होने तक दूसरा अनुरोध अवरुद्ध हो जाता है session_start
।Mage_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" फ़ाइल का स्क्रीनशॉट पोस्ट किया है ।