स्मृति प्रदर्शन को बेहतर बनाने के लिए Wordpress को रीक्रिएट करना [बंद]


63

मैं Wordpress स्मृति की खपत पर एक करीबी नजर थी। मेरी साइट पर, ऐसा लगता है कि प्रत्येक पेज हिट के लिए 20MB RAM आवंटित हो जाता है, बस सभी प्लग इन को चलाने के लिए कम्फर्टेबल वातावरण तैयार करना है। मैंने इसे इसी प्रकार प्लॉट किया है:

अनुकूलन करने के लिए कोई एकल स्थान नहीं है, कोई भी बुरा आदमी नहीं है जो अधिकांश मेमोरी खाता है। खपत सभी कई कई php मॉड्यूल में फैली हुई है।

हम वर्डप्रेस को केवल एक बार मेमोरी में अपने परिवेश को कैसे आरंभ कर सकते हैं, और फिर इसे प्रत्येक हिट के लिए कई बार पुन: उपयोग करें? मैं प्रत्येक उपयोगकर्ता क्लिक पर धीमी गति से PHP 20 एमबी खाने के लिए नहीं करना चाहता हूं - यहां तक ​​कि बहुत सारी मेमोरी वाले सर्वर पर, यह उस काम को पूरा करने के लिए सेकंड लेता है। आपको मूल रूप से मेमोरी की केवल पढ़ने की आवश्यकता होगी जिसे पुन: उपयोग किया जा सकता है।

इसके अलावा ... क्यों 20MB? किसी को भी इस में अंतर्दृष्टि प्रदान कर सकते हैं?

संपादित करें: यहाँ मेरे विकास मशीन पर चल रहे वर्डप्रेस पर WinCacheGrind आउटपुट है (साझा होस्टिंग की तुलना में तेजी से)। जैसा कि आप देख सकते हैं, यह मुख्य पृष्ठ के HTML का उत्पादन करने के लिए केवल एक सेकंड में क्रंच कर लेता है। साझा होस्टिंग द्वारा धीमा करें और आपके लिए परेशानी का एक नुस्खा है। मैंने वह तरीका चुना, जिसमें ज्यादातर समय लगता है। आप इसे कैसे अनुकूलित करेंगे?

संपादित करें: यहां इस शानदार कार्यप्रणाली से क्वेरी आँकड़े हैं ।

लोड: 12 क्वेरीज़ - 532ms - 19.1MB - 43 कैश हिट / 53
क्वेरी: 15 प्रश्न - 563ms - 19.0MB - 72 कैश हिट / 86
प्रदर्शन: 21 प्रश्न - 705ms - 19.2MB - 234 कैश हिट / 257

संपादित करें: क्या आप आपको बाहर निकालने के लिए कुछ गारंटी देखना चाहते हैं? Index.php के अंत में ये लाइनें डालें:


echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";

मैंने यह गिनने की कोशिश की कि मेमोरी में वर्तमान पोस्ट का शरीर कितनी बार संग्रहीत है। मैंने 20 उदाहरण गिनाए। तब मुझे पता चला कि PHP में संदर्भ गिनती है, इसलिए प्रतियों की मात्रा घटकर केवल तीन हो गई: दो WP_Query में लग रहे हैं, एक वस्तु कैश में। मैं आगे की जांच कर रहा हूं।

यही कारण है कि मुझे लगता है कि वर्डप्रेस को मेमोरी मुद्दों को लक्षित करने की आवश्यकता है। अब आप इसकी स्मृति खपत पर यह नहीं कर सकते कि यह क्या करती है। यह बस चीजों का एक गुच्छा गलत करता है

संपादित करें: यह पता लगाने की कोशिश करने के एक दिन बाद, यहां मेरे निष्कर्ष हैं:

1) सभी मेमोरी का 88% आवश्यकता से आता है या इसमें शामिल हैं या शामिल हैं: कॉल के प्रकार:

2) php फ़ाइल में अनुरोध को प्रस्तुत करने के पहले भाग के दौरान अधिकतर होता है (आश्चर्य की बात नहीं), जो कि सभी मेमोरी को खाया जाता है:

3) अनुरोध करने के दौरान निष्पादित होने वाले सभी कार्यों की साजिश करना काफी दिलचस्प है। कुल 12000 से अधिक कॉल हैं। मैंने इसे और अधिक दृश्यमान बनाने के लिए उन्हें घबराहट दी (स्तर अक्ष मूल रूप से स्टैक की गहराई है):

4) आगे का एकमात्र तरीका जो मैं सोच सकता हूं, उसमें शामिल .php फ़ाइलों की मात्रा को कम करना है। यदि मैं उन फ़ाइल के फंक्शन्स को विभाजित करता हूं, तो आप देख सकते हैं कि कई फाइलें एक या दो बार हिट हो जाती हैं। हमें एक तरीका चाहिए कि जब उन्हें ज़रूरत न हो तो कैसे छोड़ें। उदाहरण के लिए मेरा रिमोट डेटाबेस बैकअप प्लगइन लोड और पंजीकृत हो जाता है, बस कभी भी उपयोग नहीं किया जाना चाहिए। यहाँ फ़ाइल नाम से उपरोक्त प्लॉट विभाजन है:

मैं अपनी सभी प्रतिष्ठा के लायक एक इनाम की पेशकश कर रहा हूं :) रिफैक्टरिंग के लिए जो कि मेरे ब्लॉग स्मृति पदचिह्न को 30% या अधिक से काटने के लिए प्रेरित करेगा।

संपादित करें: मैंने WP 3.1 स्थापित किया है, यहां पुराने संस्करण के साथ तुलना की गई है।

ब्लू WP 3.1 है, लाल 3.0.4 है। नया WP तेज़ है, लेकिन अधिक मेमोरी भी खाता है।

यहाँ एक सूची है जिसमें फ़ाइल शामिल है।

यह मुझे एहसास दिलाता है कि "ऑल इन वन एसईओ पैक" द्वारा कितनी मेमोरी खाई जाती है - एक एवेन्यू केवल प्लगइन की कार्यक्षमता का एक अंश का उपयोग करने के लिए होगा जो मुझे चाहिए। इसके अलावा, मेरे अपने प्लगइन्स बहुत खराब लग रहे हैं।

मैं उदाहरण पर comment.php पर सशर्त लोडिंग की कोशिश करना चाहूंगा (मैं अपने ब्लॉग पर टिप्पणियों को अस्वीकार करता हूं) और कई अन्य। मैंने सभी हटाए गए कोड को हटा दिया। मैंने केवल मांग पर अपने वैश्विक तालिकाओं को लोड करने के लिए kses.php की छंटनी की। मैंने l10n को सरल बनाया (मैं कोई स्थानीयकरण नहीं करता हूं), इसके कार्यों को बिना लुकअप के, तुरंत तारों को वापस कर देता हूं। मैं अभी भी मनमाने ढंग से स्थापित किए गए 30% के निशान से बहुत दूर हूं।

संपादित करें: मैंने एपीसी को डिफ़ॉल्ट सेटिंग्स (ओपकोड कैश के 32 एमबी) के साथ डाउनलोड और सक्षम किया है। यहाँ तुलना है:

आप देख सकते हैं कि कोड लोडिंग बड़े पैमाने पर तेज हो गई है, और कोड भी मेमोरी में कम जगह लेता है (शायद इसलिए कि हम सिर्फ ऑपकोड से निपटते हैं, मूल स्रोत से नहीं)। स्मृति की खपत हालांकि अभी भी काफी अधिक है।


क्या आप कैशेग्रिंड फ़ाइल को कहीं अपलोड कर सकते हैं? बस ध्यान दें कि मुझे याद नहीं है कि क्या निजी रखने लायक कुछ भी इसमें शामिल है, अगर - तो नहीं।
रारस्ट

@ यह ठीक होना चाहिए। foxloft.com/files/mbala/cachegrind.out
रोमन ज़ेनका

1
हम्म, मैं आपके निष्कर्ष से सहमत हूं - वास्तव में कुछ भी नहीं निकलता है, इसे ठीक करने के लिए कहें। मैंने अपने स्थानीय टेस्ट स्टैक (3.1, एमएस, ट्वेंटी टेन, थीम यूनिट टेस्ट डेटा) पर नए सिरे से डंप किया है और 1,5s प्राप्त किया है (अधिकांश अंतर कस्टम मेनू के कारण प्रतीत होता है - बात स्लो है)। इसलिए मुझे लगता है कि इसे ठीक करने के लिए कुछ नहीं करना चाहिए।
Rarst

@Rarst आपकी मदद के लिए बहुत बहुत धन्यवाद। मुझे लगता है कि ठीक करने के लिए सामान है, लेकिन इसके लिए वर्डप्रेस की वास्तुकला को कुछ पूरी तरह से अलग दर्शन में बदलने की आवश्यकता होगी, और यह बहुत अधिक काम है।
रोमन ज़ेनका

जवाबों:


25

मुसीबत के लायक नहीं। वर्डप्रेस सिर्फ-बहुत मेमोरी नहीं खाता है, क्योंकि। यह बहुत अधिक मेमोरी खाता है क्योंकि यह हुड के नीचे बहुत अधिक कार्यक्षमता चलाता है।

स्थैतिक कैश प्लगइन के साथ परिणाम (पेज जनरेट) करने के लिए यह और अधिक आसान और कुशल है। इस तरह से अधिकांश आगंतुक WP को भी हिट नहीं करेंगे।


2
मैं पहले से ही एक कैश का उपयोग कर रहा हूं, लेकिन मेरे पास अभी भी कुछ पृष्ठ हैं जो वास्तव में प्रकृति में गतिशील हैं (उदाहरण के लिए खरीदारी की टोकरी)। और जब तारों को सही ढंग से आवंटित नहीं किया जाता है, तो उपयोगकर्ता 20 सेकंड के लिए इंतजार कर सकता है - अर्थात्, GoDaddy पर, दी गई है, लेकिन यदि नहीं, तो भी मुझे लगता है कि यह कम से कम ~ 3 सेकंड होगा। मैं बस उस तरह का तेज़ अनुभव प्रदान नहीं कर सकता, जिसका उपयोग लोग Google से करते हैं।
रोमन ज़ेनका

8
@ रोमन ज़ेनका यदि आपको विशिष्ट प्रदर्शन की ज़रूरत है तो आप विशिष्ट समाधानों की तलाश में बेहतर हैं, बजाय यह उम्मीद करने के कि वर्डप्रेस खुद जादुई रूप से संसाधनों पर सुपर फास्ट और लाइट हो जाएगा। पहली चीज़ जो मैं देखने का सुझाव दूंगा वह है ओपकोड कैश और टुकड़ा स्थिर कैशिंग ... लेकिन इससे पहले कि आपको इससे बाहर निकलने के लिए बेंचमार्क करने की आवश्यकता है और न केवल यह निर्धारित करें कि मेमोरी कहाँ जा रही है, बल्कि समय भी कहाँ बिताया जाता है। वर्डप्रेस पर्यावरण है, अपने आप से अड़चन नहीं। अड़चन है कि आप क्या करते हैं।
रारस्ट

@ मैं वास्तव में CPU उपयोग को बेंचमार्क करता था और मैं किसी भी विशिष्ट स्थान पर उंगली नहीं उठा सकता जो परेशानी का कारण बनता है। स्मृति के समान - यह सभी जगह फैला हुआ लगता है। हालाँकि, मेरे बेंचमार्किंग को एक इष्टतम तरीके से नहीं किया जा सकता है - मैं XDebug प्रोफाइलर और कैशेग्रिंड का उपयोग करता हूं - यह उदाहरण के लिए डेटाबेस कॉल के कारण विलंबता को छेड़ने के लिए काफी कठिन है। मैं बेहतर रूपरेखा तकनीकों के लिए संकेत के लिए आभारी रहूँगा।
रोमन ज़ेनका

@Rarst प्रोफाइलिंग स्क्रीनशॉट जोड़ा गया था।
रोमन ज़ेनका

4
यह GoDaddy का सर्वर धीमा भी हो सकता है। वे सबसे बड़े हार्डवेयर नहीं होने के लिए जाने जाते हैं और " अपने सर्वर को अपग्रेड करने के बजाय टेलीविजन विज्ञापनों के लिए भुगतान करेंगे "
ज़ैक

23

और यही कारण है कि मुझे लगता है कि वर्डप्रेस को फिर से लिखने की गंभीर आवश्यकता है। अब आप इसकी स्मृति खपत पर यह नहीं कर सकते कि यह क्या करती है। यह बस चीजों को गलत करता है।

कितना भोला निष्कर्ष। चीजें आप कभी नहीं करना चाहिए, मैं भाग पढ़ें ।

स्मृति उपयोग भूखंडों के लिए धन्यवाद, यद्यपि।

बहुत बाद में संपादित करें: ऑटोमैटिक ने एक पुस्तकालय जारी किया है जिसे प्रीफ़ॉर्क कहा जाता है, जो आप से पूछ रहे हैं: वर्डप्रेस कोड को केवल एक बार रैम में लोड करना।


सच है, यह भोला है। हो सकता है कि मुझे "फिर से लिखना" के बजाय "रिफ्लेक्टर" कहना चाहिए था, तब यह बहुत बेहतर लगता है। पोस्ट अपडेट की गई।
रोमन ज़ेन्का

2
ठीक है, ठीक है, यदि आपके पास विशिष्ट सुझाव (विशेष रूप से पैच) हैं, तो आप उन्हें ट्रेस
scribu

मेरे द्वारा अभी इस पर काम किया जा रहा है। मैं स्मृति में वस्तुओं का नक्शा बनाने की कोशिश कर रहा हूं, इसलिए मैं देख सकता हूं कि किस चीज का कितना उपयोग किया जाता है। क्या कोई उपकरण है जो मेमोरी डंप लेगा और उसे प्लॉट करेगा?
रोमन ज़ेनका

5
@scribu - जोएल की पोस्ट के लिंक के लिए +1!
माइकस्किंकेल

1
ठीक है, बस ध्यान रखें कि WP_Object_Cache को एक
यादगार

17

वर्डप्रेस 3.2 के साथ शुरू, PHP 5.2 न्यूनतम आवश्यकता होगी। मुझे लगता है कि हमारे बेल्ट के तहत, कोर के बिट्स का पुनर्गठन किया जा सकता है, और ऑटो-लोडिंग के साथ कक्षाओं का उपयोग कर सकते हैं। इससे हमें कोड के कुछ हिस्से को लोड करने से बचना होगा जब तक कि उन्हें वास्तव में जरूरत न हो। उदाहरण के लिए, यदि पृष्ठ दृश्य में कोई एम्बेड या गैलरी नहीं थीं, तो हम बहुत सारे मीडिया कोड लोड करने से बच सकते हैं।

हालांकि, भले ही वे उस मार्ग पर जाने का फैसला करते हैं, मैं उम्मीद करता हूं कि यह धीमी गति से विकास होगा (जैसे कि अन्य अंडर-हुड परिवर्तनों में से बहुत कुछ हुआ है)। इसमें बहुत सारी फ़ाइलों और कोड के स्थान के आसपास फेरबदल करने की आवश्यकता होती है, जो संभवतः कुछ प्लगइन्स के लिए पीछे की ओर कंप्रेशर को तोड़ सकता है।

समस्या का एक हिस्सा (यदि इसे वास्तव में कहा जा सकता है) यह है कि इस तरह की सशर्त लोडिंग के बिना, कोर फ्रेमवर्क समय से पहले पता नहीं कर सकता है कि सामग्री को देखने के लिए किस कार्यक्षमता की आवश्यकता होगी या इसकी आवश्यकता नहीं है। इसलिए बहुत सारे कार्यों को केवल उसी स्थिति में लोड किया जाना चाहिए जब वे आवश्यक हों।


@ डगल कैंपबेल मैंने इस सवाल पर एक इनाम शुरू किया, यह देखने के लिए कि क्या हम वर्डप्रेस के इस कम से कम एक उदाहरण को हैक कर सकते हैं ताकि कम से कम 30% मेमोरी खपत में सुधार हो सके, अपेक्षाकृत दर्द रहित। यह भविष्य के कुछ विकास को प्रेरित कर सकता है।
रोमन ज़ेन्का

सशर्त लोड हो रहा है, जबकि संभावित रूप से मेमोरी कंसम्पशन को कम करने, जब ओपोड कैशिंग शामिल है , तो गति को नुकसान पहुंचाता है। हम गति का पक्ष लेते हैं।
स्क्रीबू


@ स्क्रिप्बू जब आप "सशर्त लोडिंग" कहते हैं, तो क्या आप ऑटोलडिंग के बारे में बात कर रहे हैं, या वास्तव में एक शर्त के आधार पर कोड लोड कर रहे हैं? यह गति को कितना नुकसान पहुंचाता है?
रोमन ज़ेन्का

1
धन्यवाद! जैसा कि मैंने कहा, मुझे नहीं पता कि क्या WP कोर कभी उस मार्ग को ले जाएगा (आवश्यक रीफैक्टरिंग बहुत चरम हो सकती है)। लेकिन आप इस विश्लेषण में आपके द्वारा किए गए प्रयास और आपके द्वारा निर्मित रेखांकन से बहुत प्रभावित हुए। अच्छा काम करते रहें!
डगल कैंपबेल

16

हम वर्डप्रेस को केवल एक बार मेमोरी में अपने परिवेश को कैसे आरंभ कर सकते हैं, और फिर इसे प्रत्येक हिट के लिए कई बार पुन: उपयोग करें?

इसे ओपकोड-कैशिंग कहा जाता है।

http://en.wikipedia.org/wiki/PHP_accelerator


1
मैं APC को एक कोशिश देने जा रहा हूं और देखूंगा कि क्या होता है। जब मैंने मूल रूप से उस प्रश्न को पूछा था, तो मेरा मतलब केवल ओपोड कैशिंग से अधिक था - मेरा मतलब था कि पूरे वातावरण का पुन: उपयोग करना जो वर्डप्रेस - कोड + डेटा बनाता है। मेमकाटेड आपको डेटा को तेज़ी से प्राप्त करने में मदद करेगा, लेकिन आप सर्वर मेमोरी में डेटा का क्लोनिंग करेंगे। अब ऐसा लगता है कि ओपोड कैशिंग संभवतः सभी मेमोरी खपत के ~ 90% का ख्याल रखेगा।
रोमन ज़ेन्का

यदि आपके पास कुछ प्रयोगों के लिए संसाधन हैं, तो आप FastCGI वातावरण सेट करने का भी प्रयास कर सकते हैं। मुझे mod_php और FastCGI के तहत चलने के बीच कुछ तुलनाओं में बहुत दिलचस्पी होगी।
डगल कैम्पबेल

5

आप शायद राम के उपयोग को कम करने का प्रबंधन नहीं करेंगे। लेकिन अगर आप उपयोग कर रहे हैं mod_php, तो आप mod_fcgidइसके बजाय स्विच करना चाह सकते हैं ।

जबकि mod_php थोड़ा धीमा है, यह तब भी php को लोड करता है, जब उसे ज़रूरत नहीं होती है, जैसे कि छवियों, स्थिर फ़ाइलों या यहां तक ​​कि कोचिंग की सेवा। यदि आपके पास बहुत सारे अनुरोध हैं, तो यह बहुत राम है।

fcgid का उपयोग करने से यह बहुत कम हो जाएगा।

इसके अलावा, स्टैटिक कैश (जैसे w3total कैश) का उपयोग करने से php पर कॉल करने से बचेंगे जो वास्तव में बहुत अच्छा फायदा है: कम रैम का उपयोग, कम db कनेक्शन।


4

हा। मुझे लगता है कि मैं पूरी तरह से मेरे साझा होस्टिंग खाते संभाल कर सकते हैं परे डेटा और उपयोग के साथ ओवरलोड करने का इरादा एक वेब अनुप्रयोग पर काम कर रहा हूँ अब, इसलिए मैंने तय कर लिया - से काम करने की कोशिश करने के लिए - जबकि यह WP में निर्माण करने के लिए किया गया है सुपर आसान होगा BackPress के रूप में एक ढांचा और निर्माण केवल वही जो मुझे अपने विशिष्ट उपयोग के मामलों के लिए आवश्यक था।

इसलिए मैं WP में सैकड़ों PHP फ़ाइलों से अपने मुख्य वातावरण को केवल बीस या उससे कम करने में सक्षम हूं ताकि मुझे वास्तव में ज़रूरत हो, जबकि अभी भी सभी db, HTTP, उपयोगकर्ता-प्रबंधन, स्वरूपण और क्रॉन का लाभ उठाने में सक्षम हो ऐसे कार्य जो मुझे वर्डप्रेस में पसंद हैं।

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


1
मैं मानता हूं कि WP लंबे समय से ठीक-ठाक है। लेकिन मुझे नहीं लगता कि प्लगइन्स के एक विशेष मिश्रण के साथ भद्दा होस्टिंग पर काम करना ठीक था। मैं यह देखने के लिए उत्सुक हूं कि मैं इसे कितना आगे बढ़ा सकता हूं। भले ही बदलाव इसे कोर में न करें, अगर आपको लगता है कि कोर को हैक करने का एक प्रलेखित तरीका होना अच्छा है।
रोमन ज़ेनका

3

हाँ, वर्डप्रेस पहले सब कुछ लोड करता है और फिर वही करता है जो हम इसे करने के लिए कहते हैं। मैं कहीं याद कर सकता हूं कि हम रैम में एक वर्चुअल पूल बना सकते हैं जहां हम फाइलों में डाल सकते हैं। मुझे पूरे वर्डप्रेस को मेमोरी में डालने का विचार था (<10MB) और फिर हम बहुत सारे I / O बचा सकते हैं जो अकेले ही गति को बढ़ावा दें। लेकिन मुझे इसे आजमाने का मौका कभी नहीं मिला और इसके अलावा मैं वास्तव में ऐसा कुछ करने में पारंगत नहीं हूं। लेकिन यह एक कोशिश के लायक है।


और मैं Rarst के साथ एक स्थिर कैश प्लगइन का उपयोग करने के लिए सहमत हूं ताकि कोई भी प्रसंस्करण न हो। लेकिन इसका उपयोग अच्छी गतिशीलता के साथ भी किया जा सकता है। :)
एशफैम

मुझे वह विचार पसंद है। मुझे यकीन नहीं है कि I / O विलंबता के कारण यह समस्या कितनी है, और डेटा पर PHP धीरे-धीरे चबाने के कारण कितना है। क्या आप एक तरीका जानते हैं कि कैसे बताएं?
रोमन ज़ेन्का

क्षमा करें, यह मेरे दिमाग में सिर्फ एक विचार है। हो सकता है कि यह प्रदर्शन को प्रभावित नहीं करता है कि डेटा के रूप में यह कितना प्रतीत हो सकता है आमतौर पर हार्ड डिस्क से ब्लॉक के रूप में पढ़ा जाता है, इसलिए आवश्यक बहुत सारे अन्य डेटा पहले से ही प्राप्त किए जा सकते हैं। मुझे भी यकीन नहीं हो रहा है
आश्फमे

3

कुछ बुनियादी सुझाव:

  1. कैशिंग के लिए w3 कुल कैश प्लगइन ।।
  2. ज्ञापन स्थापित करें और सक्षम करें, w3 कुल कैश सेटिंग्स से भी सक्षम करें (opcode cache एक अच्छा विकल्प है, लेकिन यह w3 कुल कैश प्लगइन के साथ अच्छा नहीं जाता है)
  3. विषय फ़ाइलों में सीधे लिंक के लिए प्रश्नों को कम करें ..
  4. सभी अतिरिक्त अप्रयुक्त प्लगइन्स को अक्षम करें और निकालें।
  5. डेटाबेस का अनुकूलन।

मैं प्रतिदिन विशाल ट्रैफ़िक के साथ एक अच्छी तरह से ज्ञात वर्डप्रेस साइट चला रहा हूँ .. im समर्पित पर भी नहीं, मेरे लिए बहुत अच्छा कर रहा है :)

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