प्रदर्शन अनुकूलन के हित में मॉडल परत के किन हिस्सों को दरकिनार किया जा सकता है


28

मैं वर्तमान में देख रहा हूं कि एक बहुत ही सरल स्कीमा (लगभग 5 फ़ील्ड) के साथ एक डेटाबेस टेबल के लिए, यह मेरे स्थानीय विकास वातावरण (SSD ड्राइव) में ~ 50 आवेषण / सेकंड के तहत सिर्फ एक की दर से नए रिकॉर्ड सम्मिलित कर रहा है - यह साथ है संबंधित तालिकाओं को आबाद करने वाले मॉडल पर कोई पर्यवेक्षक नहीं है।

प्रत्यक्ष एसक्यूएल का उपयोग कर मैं काफी सुधार देख रहा हूं - ~ ​​1800 आवेषण / सेकंड। हम अपने मॉडलों के प्रदर्शन को अनुकूलित करने के प्रयास के बारे में सोच रहे हैं, लेकिन निश्चित रूप से हम सभी अच्छी स्थिरता और लचीलेपन को खोना नहीं चाहते हैं जो मैगेंटो कोर हमें देता है।

मैं सोच रहा था कि क्या कोई इस मार्ग से पहले चला गया है और क्या मॉडल परत के घटकों के संदर्भ में कुछ आसान जीत हैं जो अपेक्षाकृत सुरक्षित रूप से बाईपास किए जा सकते हैं जो महत्वपूर्ण प्रदर्शन को बढ़ावा देंगे।

इस तरह की चीजें:

  • वर्ग नाम संकल्प
  • घटनाओं को बचाने से पहले और बाद में
  • घटना प्रेषण
  • लेन-देन
  • आदि।

अद्यतन: मैंने झूठ बोला था, वास्तव में पर्यवेक्षकों या afterSave () के फायरिंग से कुछ अतिरिक्त प्रश्न थे, जो मैंने देखा जब मैंने डेटाबेस क्वेरी लॉग का निरीक्षण किया। पूरी तरह से सरल इकाई के खिलाफ बेंचमार्किंग वास्तव में मुझे ~ 300 पंक्तियों / सेकंड के साथ Magento मॉडल - केवल MySQL ओवरहेड लेनदेन कर रहे हैं।


1
क्या आपने डेटा लिखने के लिए मॉडल ऑब्जेक्ट का पुन: उपयोग करने की कोशिश की है? यानी इसे स्पष्ट करें, सेट करें और फिर सेव करें। इससे कॉल प्राप्त करने से बचना होगा क्योंकि मैकडेल और पीएचपी में निहित वस्तु तात्कालिकता ओवरहेड।
davidalger

इसके अलावा, मैं यह अनुमान लगाने जा रहा हूं कि यहां अड़चन आपके सीपीयू में है, ड्राइव में नहीं ... क्योंकि सभी आवश्यक कोड फाइलें पहले पास से लोड की जाएंगी।
दाविदालगार

धन्यवाद, डेविड! मैं भी यही कोशिश करूँगा। वास्तव में मुझे लगता है कि हम अभी भी I / O प्रश्नों की संख्या से बंधे हैं जिन्हें निष्पादित किया जा रहा है। हमारे पास लगभग 20 प्रश्न हैं जो किसी दिए गए मॉडल को बचाने के लिए चल रहे हैं - जिनमें से कुछ को हमें रखने की आवश्यकता है (संबंधित तालिकाओं को पॉप्युलेट करने के लिए, चयन करने से पहले अस्तित्व की जांच करने के लिए चयन करें), और अन्य जिन्हें हम संभवतः हटा सकते हैं (असंगत सत्र बचाता है, अतिरिक्त भार () कि आवेदन तर्क में बचा जा सकता है)
kalenjordan

आप आसानी से पता लगा सकते हैं। रैम डिस्क पर पूरे रूट डायर और MySQL DB को माउंट करें। लेकिन मुझे दृढ़ता से संदेह होगा कि I / O सर्वर ग्रेड उपकरण में एक मुद्दा है। आप शायद "अधिक लाभ सहेजें" पर अक्षमता देखेंगे।
बेन लेसानी - सोनासी

जवाबों:


17

एक चीज जो पूरी साइट को गति दे सकती है वह है Varien_Profilerअपने उत्पादन स्थल पर मौजूद सभी संदर्भों को हटाना । भले ही प्रोफाइलर अक्षम हो, यह हमेशा जाँचता है कि क्या यह सक्षम है इसलिए प्रत्येक कॉल के लिए Varien_Profiler::एक अतिरिक्त ifविवरण होगा। बेशक, इन सभी कॉल्स को हटाने से प्रोफाईलर का उपयोग नहीं कर पाने की कीमत पर आता है। हालांकि, यह पूरी साइट को शायद 5% या तो गति दे सकता है (यह एक व्यक्तिपरक उत्साह है, लेकिन मैगेंटो के लिए कई कॉल हैं Varien_Profiler)। मैंने वास्तव में सभी फाइलों में इन कॉल्स को स्वचालित रूप से टिप्पणी करने के लिए एक छोटी सी शेल स्क्रिप्ट लिखी थी और मैं इसे कल अपनी पोस्ट में जोड़ूंगा जब मैं काम पर हूं और मेरा कोड तैयार है।

जैसा कि अब वादा किया गया है कि इन कॉल्स को कमेंट करने के लिए कोड:

grep -l "Varien_Profiler" * -R > profiler.txt 
for x in `cat profiler.txt` 
do 
sed -i '/Varien_Profiler/s/^/\/\//' $x
done

यह ऐप में / साथ ही साथ lib / फ़ोल्डर में लिनक्स कंसोल में चलाया जाना चाहिए। आपको फ़ाइल /lib/Varien/Profiler.php को बाद में मैन्युअल रूप से समायोजित करने की आवश्यकता हो सकती है। यह भी ध्यान दें कि आपको इसे जीवित होने से पहले एक सुरक्षित वातावरण में पूरी तरह से परीक्षण करना चाहिए - लेकिन मुझे लगता है कि यह स्पष्ट होना चाहिए;)


वाह! मैंने कभी भी 5% के करीब की कल्पना भी नहीं की होगी जब विकलांगों के लिए वेरिएन_प्रोफाइलर कॉल। मैं जाँच करूँगा कि धन्यवाद!
कालेंजर्डन

@sparcksoft जैसा कि वादा किया गया था, मैंने अब कोड जोड़ा।
mpaepper

1
यह वह जगह है जहाँ सी precompiler कंडीशनर वास्तव में अच्छा कर रहे हैं। यह बहुत बुरा है कि PHP उनके पास नहीं है, लेकिन निश्चित रूप से, इसका मतलब यह होगा कि यह पूर्व-संकलन और कैशिंग में निर्मित का अपना तरीका होगा। :)
डेवडाइगर

2
आप इसे लिख भी सकते हैं find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;यदि आप एक तेज़ ऑन्लाइनर पसंद करते हैं।
कोजीरो

14

जब Magento के मॉडल पर बहुत सारी बचत होती है, तो Magento इंडेक्सर को निष्क्रिय करना सबसे अच्छा होता है, जो इस प्रक्रिया को धीमा कर देता है:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

और जब आपका काम हो तो इसे सक्षम करना:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');

आह गच्चा, अच्छा लगा। तो ऐसा होगा कि यदि आप बहुत से ग्राहक_आर्थिक रिकॉर्ड सहेज रहे हैं और प्रत्येक बचत के लिए हो रहे ग्राहक अनुक्रमण से बचना चाहते हैं? मेरे मामले में मैं वास्तव में एक कस्टम इकाई के खिलाफ ऐसा कर रहा हूं जिसमें कोई भी अनुक्रमण नहीं है - कम से कम मेरे द्वारा किए गए बेंचमार्क के लिए। हमारे पास कुछ कस्टम इंडेक्स भी हैं जो मैं शायद इस टिप का उपयोग करूंगा!
कालेंजर्डन

मुझे नहीं लगता कि कोई ग्राहक अनुक्रमण है, लेकिन यह निश्चित रूप से आपकी मदद करेगा जब बहुत सारे उत्पादों और इस तरह के संशोधन। किसी भी तरह से यह एक कोशिश के काबिल है!
रिक कुइपर्स

क्षमा करें, हाँ EAV उत्पाद डेटा और उदाहरण के लिए। धन्यवाद।
कालेंजर्डन

अरे! आपको (आंशिक रूप से) उसके बाद reindex करना पड़ सकता है?
एलेक्स

@ एलेक्स हां, इंडेक्सर्स को MODE_REAL_TIME पर रीसेट किया जाता है, इसलिए यह शेड्यूल द्वारा रीइंडेक्स हो जाएगा। आप निश्चित रूप से, यदि आप चाहें तो इसे मजबूर कर सकते हैं।
रिक कुइपर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.