बड़ी साइटों के लिए मेमोरी-सेविंग कैशे-समाशोधन रणनीति?


30

मेरे ड्रुपल 7 साइटों में से एक में हजारों फ़ील्ड हैं, सामग्री प्रकारों का एक समूह, 25 से अधिक दृश्य, और सैकड़ों (जल्द ही हजारों) प्रोफ़ाइल प्रकार के। इस वजह से, मैं एक कोर पैच का उपयोग कर रहा हूं जो बेहतर कैश एंट्री फ़ील्ड जानकारी (http://drupal.org/node/1040790), और व्यू का -dev संस्करण है जो डिस्प्ले द्वारा बेहतर कैश व्यू देता है (एक बड़ा होने के बजाय) इसमें सभी दृश्य डेटा के साथ कैश पंक्ति देखें)।

इसने 160 एमबी + के बजाय 20-30 एमबी रैम के साथ लोड करने के लिए साइट पर अधिकांश पृष्ठों की मदद की है, (10MB + फ़ील्ड और विचारों के लिए कैश_ * तालिका पंक्तियों को खींचने के बजाय, पैच कैश_ * डेटा को अधिक कुशल रखने में मदद करते हैं)।

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

कम-यातायात चक्रों के दौरान, यह कोई बड़ी बात नहीं है; सौ या तो उपयोगकर्ताओं को पृष्ठ लोड होने से पहले एक मिनट इंतजार करना होगा। लेकिन उच्च-ट्रैफ़िक चक्रों के दौरान, अपाचे सर्वर पागल हो जाता है, 40+ सीपीयू लोड के साथ, और मेमोरी जल्दी से भर जाती है क्योंकि सभी वर्कर थ्रेड प्रतीक्षा करते हैं, और अपनी मेमोरी को अधिकतम करते हैं, जिससे स्वैपिंग होती है। यह एक तरह से मौत का सर्पिल है। Httpd को फिर से शुरू करने से चीजें साफ हो जाएंगी, लेकिन चीजों को वापस सामान्य होने में 5-10 मिनट लगते हैं।

मेरा लक्ष्य इसे बनाना है ताकि कैश क्लियर हो जाए ताकि साइट अपने घुटनों पर न आए। एक के लिए, यदि मैं admin_menu के व्यक्तिगत कैश क्लियरिंग फ़ंक्शंस (जैसे "CSS और JS" का उपयोग करता हूं, तो "मेनू", फिर "थीम रजिस्ट्री" इत्यादि), चीजें तब तक सुचारू रूप से चलती हैं जब तक कि मैं "पेज और अन्य" विकल्प को हिट नहीं करता। जब दृश्य 'कैश' रीसेट हो जाता है (बहुत सीपीयू और डेटाबेस-गहन ऑपरेशन, जिसमें कैश की आवश्यकता होती है) की संख्या के साथ, और जब फ़ील्ड जानकारी कैश रीसेट हो जाता है (जो इस साइट पर सीपीयू और डेटाबेस-तीव्र भी है)।

तो ... मेरे प्रश्न / विचार:

  • ड्रश और / या अन्य शेल स्क्रिप्टिंग का उपयोग करना, क्या मेरे लिए "एक बार में सभी कैश ब्लास्ट, और एक साफ पुनर्निर्माण के लिए आशा" की तुलना में अधिक बुद्धिमान तरीके से कैश को साफ करना संभव है?
  • क्या मैं HTTP अनुरोधों को ब्लॉक कर सकता हूं जबकि कैश समाशोधन हो रहा है इसलिए कैश कैश-स्टैम्पिंग अनुरोधों के झुंड के साथ अपाचे नहीं मिलता है?
  • अगर मैं Drupal / सामान्य httpd अनुरोध के बाहर कैश साफ़ कर सकता हूं, तो मैं निश्चित रूप से कैश क्लियर ऑपरेशन के लिए एक उच्च PHP मैमोरी_लिमिट सेट कर सकता हूं, और अपने यूनिवर्सल मैमोरी_लिमिट (अभी 256MB पर सेट है) के मामले में, व्यक्तिगत httpd थ्रेड को कैश साफ़ करने की आवश्यकता है ...)।

मूल रूप से: क्या यूआई में बटन क्लिक करने या उपयोग करने के अलावा ड्रुपल के साथ सभी कैश को साफ करने का कोई बुद्धिमान और सुंदर तरीका है drush cc all?

[ स्पष्टीकरण के लिए संपादित करें : मेरे पास मुख्य समस्या कैश रीबिल्ड्स है , जो (ए) थोड़ी देर लेते हैं, और (बी) सभी अन्य अनुरोधों को तब तक रोकते हैं जब तक कि रिकॉड्स पूरा नहीं हो जाते। मैं इसे बनाने का एक तरीका खोजना चाहता हूं ताकि उच्च-यातायात समय के दौरान यह बहुत ही घातक न हो।]


2
दिलचस्प सवाल। यदि आप कैशिंग अक्षम करते हैं, तो क्या आपकी साइट का प्रदर्शन पर्याप्त है? IOW, क्या आपने अपाचे / PHP / MySQL को चलाने के लिए अनुकूलित किया है और साथ ही साथ यह w / o कैशिंग सक्षम कर सकता है? जाहिर है, मैंने आपका सिस्टम नहीं देखा है, लेकिन apststat = 0 सेट करना और यह सुनिश्चित करना कि आपके पास APC के लिए पर्याप्त मेमोरी है, डिस्क उपयोग में मदद करेगा। Mysqltuner.pl का उपयोग करना भी आपको एक संकेत देगा कि क्या MySQL अड़चन है। फिर आप कैशिंग और ट्वीक चालू कर सकते हैं (यह कुछ DB उपयोग को बढ़ाएगा, इसलिए आपको MySQL मापदंडों को समायोजित करने की आवश्यकता हो सकती है)।
mpdonadio

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

@MPD - कैशिंग अक्षम करने से पूरी साइट जल्दी से नष्ट हो जाएगी; आमतौर पर 100-500 प्रमाणित उपयोगकर्ता, और साइट के कुछ हिस्से बहुत भारी होते हैं। मेरे लिए सबसे बड़ी समस्या कैश नहीं है (मैंने मेमकेड, रेडिस और एपीसी यूजर कैश के साथ प्रयोग किया है), लेकिन कैश के पुनर्निर्माण के साथ, जो बहुत सीपीयू-तीव्र है।
geerlingguy

आदर्श रूप से आप पुराने कैश डेटा का उपयोग करना चाहते हैं, जबकि नए कैश का पुनर्निर्माण किया जा रहा है। क्या ये सही है?
mikeytown2

@ mikeytown2 - सही-यही आदर्श होगा।
geerlingguy

जवाबों:


9

वहाँ किसी भी बुद्धिमान और सुंदर तरीका है Drupal के साथ सभी कैश को साफ करने के अलावा बस यूआई में बटन पर क्लिक करें, या ड्रुक सब का उपयोग कर?

कैश कार्यों मॉड्यूल है कि नहीं करता है। यह नियम पर निर्भर करता है। परीक्षा के लिए, आप एक विशिष्ट दृश्य को साफ़ करने के लिए एक नियम सेट कर सकते हैं जब "x" प्रकार का नोड जोड़ा या अद्यतन किया गया हो। अधिक विवरण के लिए डॉक्स चेकआउट करें।

कैश सुशोभित मॉड्यूल पर एक नज़र डालें - अभी तक इसकी कोशिश नहीं की है लेकिन दिलचस्प लग रहा है।


मैं पहले से ही drush cc [type]विशिष्ट कैश समाशोधन (कैश क्रियाओं के समान) के लिए उपयोग कर रहा हूं, लेकिन मैं कैश को और अधिक सुंदर तरीके से ढूंढने के लिए अधिक इच्छुक हूं और सुनिश्चित करता हूं कि अन्य httpd थ्रेड्स अपाचे सर्वर को नहीं मार रहे हैं।
geerlingguy

1
ड्रम सीसी की तरह लगता है कि सभी दृश्य कैश को साफ कर देंगे। कैश क्रियाओं के साथ आप केवल एक विशिष्ट दृश्य या प्रदर्शन को साफ़ कर सकते हैं। शायद देव संस्करण में एक बग है, अन्यथा इसे कैश को फिर से बनाने में एक या दो मिनट नहीं लगेगा। क्या आपको 7.x-3.5 के विचारों का उपयोग करने में समान समस्या है? इसके अलावा पर एक नज़र डालें drupal.org/project/cache_graceful - फिर भी यह प्रयास नहीं किया है, लेकिन दिलचस्प लग रहा है
उवे

दृश्य देव अपनी कैश पंक्तियों में दृश्य प्रदर्शन को तोड़ता है, कैश पढ़ने के प्रदर्शन में मदद करने के लिए। इसका मतलब है कि दृश्य कैश के निर्माण में शायद 5 गुना अधिक समय व्यतीत करते हैं (लेकिन यह कैश को पढ़ने पर मेमोरी के उपयोग को कम करने में मदद करता है)।
Geerlingguy

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

ठीक है। मुझे आपके अनुभव को cache_graceful के साथ सुनने में दिलचस्पी होगी। किस भाग ने इसे ठीक नहीं किया?
uwe

2

मुख्य समस्या यह है कि आप कैश डेटा स्टोर करने के लिए MySQL का उपयोग कर रहे हैं - उच्च लोड साइटों के लिए यह बहुत ही अप्रभावी समाधान है।

मैं इसके बजाय मेमकेच का उपयोग करने की सलाह देता हूं । यह नाटकीय रूप से कैश सिस्टम के प्रदर्शन को बढ़ाएगा और आपको 2 शानदार लाभ देगा:

  1. Memcache पढ़ने और लिखने के कार्यों के लिए बहुत तेज है कि MySQL - आप सभी कैश ऑपरेशन (और पूर्ण कैश पुनर्निर्माण) तेजी से काम करेंगे।
  2. क्योंकि अब डीबी में संग्रहीत कैश डेटा - क्लीयरिंग कैश किसी अन्य MySQL प्रश्नों को ब्लॉक नहीं करेगा।

यहाँ Drupal 7 के लिए Memcache कॉन्फ़िगरेशन का उदाहरण है ।


मैंने मेमकास्टेड और एपीसी दोनों का उपयोग किया है, विभिन्न तरीकों से, और जब तक वे कैश रीड्स के साथ बहुत सहायता करते हैं, मेरे पास मुख्य समस्या वास्तविक पुनर्निर्माण है; डेटाबेस लगभग कुछ भी नहीं कर रहा है, जबकि वेब सर्वर कैश (बहुत धीमी / लंबी) के पुनर्निर्माण की प्रक्रिया के दौरान मुहर लगा रहा है।
जेरलिंगगुगी

एपीसी और मेमकेड अलग-अलग चीजें बनाते हैं। मुझे लगता है कि मेमकेड का सही विन्यास आपकी मदद करेगा। BTW, यदि आप साइट ज्यादातर गुमनाम उपयोगकर्ताओं द्वारा दौरा किया है - आप वार्निश का उपयोग कर सकते हैं। इस मामले में वार्निश अपने स्वयं के कैश सिस्टम का उपयोग करेगा और अपाचे को अनाम अनुरोधों के लिए निष्पादित नहीं किया जाएगा।
यूजीन फिदेलिन

साइट में लगभग 100% प्रमाणित ट्रैफ़िक है, अन्यथा मैं वार्निश का उपयोग करने पर विचार करता। मैं इस बिंदु पर कैश ग्रेसफुल मॉड्यूल देख सकता हूं।
जेरलिंगगुगी

0

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

यदि आप सभी कैश को ब्लास्ट नहीं करना चाहते हैं, तो उपयोग करें: drush cc type_of_cacheविशिष्ट को साफ़ करने के लिए, या अपने स्वयं को परिभाषित करने के लिए।

वैकल्पिक रूप से सभी कैश-जैसे तालिकाओं को मैन्युअल रूप से साफ़ करें, जैसे

echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v 

यदि आप मेमकास्टेड (बैश सिंटैक्स) का उपयोग कर रहे हैं, तो कोशिश करें:

pgrep memcached && echo flush_all > /dev/tcp/127.0.0.1/11211

क्या मैं HTTP अनुरोधों को ब्लॉक कर सकता हूं जबकि कैश समाशोधन हो रहा है इसलिए कैश कैश-स्टैम्पिंग अनुरोधों के झुंड के साथ अपाचे नहीं मिलता है?

drush -y vset maintenance_mode 1साइट तक पहुँचने वाले लोगों को रोकने के लिए रखरखाव मोड ( ) सक्षम करें । या फ्रंट-एंड को कहीं और रीडायरेक्ट करने के लिए कॉन्फ़िगर करें (जैसे वार्निश में, अपाचे या बदलने में रीडायरेक्ट .htaccess)।

यदि मैं Drupal / सामान्य httpd अनुरोध के बाहर कैश साफ़ कर सकता हूं, तो मैं निश्चित रूप memory_limitसे कैश क्लियर ऑपरेशन के लिए एक उच्चतर PHP सेट कर सकता हूं , और memory_limitकिसी भी httpd थ्रेड को खाली करने की आवश्यकता होने पर अपने सार्वभौमिक (अभी 256 एमबी पर सेट) को वापस कर सकता हूं । ।)।

समाशोधन कैश अधिक मेमोरी नहीं लेता है, लेकिन स्पष्ट होने के बाद कैश का पुनर्निर्माण अधिक हो जाएगा। आप हमेशा cron चलाकर या किसी भी पेज को खोलकर कैश को गर्म कर सकते हैं, जैसे

time php -n -d memory_limit=-1 time $(which drush) cc registry
PHP_OPTIONS='-d memory_limit="2G"' drush cron
php -d memory_limit=1G ./scripts/drupal.sh http://localhost/

प्रसंस्करण -nको अनदेखा करने के लिए निर्दिष्ट करें php.iniजो अतिरिक्त रूप से कैश समाशोधन प्रक्रिया को गति दे सकता है।


-1

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

नकारात्मक पक्ष: आपके वीसीएल टाइमआउट सेटिंग्स बनाम उत्पादन सर्वर के डाउनटाइम के कितने सेकंड / मिनट के आधार पर, वार्निश उस समय के दौरान अपडेट हो सकता है और आपको वार्निश 503 त्रुटि स्क्रीन दिखाई देगी।

लेकिन Redis या Memcache के साथ यह दृष्टिकोण मदद कर सकता है।


यह प्रश्न केवल आंतरिक Drupal कैश से संबंधित है; Drupal के कैश के पुनर्निर्माण को हमेशा के लिए ले लिया गया, और Drupal के सामने / के बाहर कैशिंग की अतिरिक्त परतें वास्तविक कैश डेटा पुनर्निर्माण में मदद करने के लिए बहुत कुछ नहीं करेंगी (इसके अलावा कुछ ट्रैफ़िक जो वेबसर्वर को कैश करने के लिए अन्यथा रखने की आवश्यकता होगी) फिर से बनाया गया है)।
जेरलिंगगुगी

उस मामले में, मुझे अच्छी तरह से काम करने के लिए Zend OpCache मिला। :-)
मुलदरजो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.