मेमकेड में अनपेक्षित (?) उच्च 'बर्बाद' स्मृति


18

अपडेट, लॉन्गिश (क्षमा करें) प्रश्न के नीचे देखें।

हमारे संकलित आँकड़ों को देखते हुए मुझे लगता है कि मुझे ऐसा मुद्दा मिल गया है जिसके बारे में मुझे पहले जानकारी नहीं थी। ऐसा लगता है कि हमारे पास एक अजीब से उच्च मात्रा में जगह है। मैंने एक बदलाव के लिए phpmemcacheadmin के साथ जाँच की , और इस छवि को मुझे घूरते पाया:

संचित कैश आकार ग्राफिक

अब मैं इस धारणा के तहत था कि सबसे खराब स्थिति यह होगी कि 50% बर्बादी होती है, हालांकि मैं सभी विवरणों को नहीं जानने वाला पहला व्यक्ति हूं। मैंने पढ़ा है - अन्य लोगों के बीच- यह पृष्ठ जो वास्तव में कुछ पुराना है, लेकिन ऐसा ही हमारे मेमेक के संस्करण है। मुझे लगता है कि मैं समझता हूं कि सिस्टम कैसे काम करता है ( उदाहरण के लिए ) मेरा मानना ​​है, लेकिन मुझे यह समझने में कठिन समय है कि हम 76% बर्बाद स्थान पर कैसे पहुंच सकते हैं।

Phpmemcacheadmin से पता चलता है कि बेदखली की दर है 2 ev/s, इसलिए यहाँ कुछ समस्या है।

  • प्राथमिक प्रश्न है: मैं इसे ठीक करने के लिए क्या कर सकता हूं । मैं इस पर अधिक मेमोरी फेंक सकता हूं (मुझे लगता है कि कुछ अतिरिक्त उपलब्ध है), शायद मुझे स्लैब कॉन्फिग के साथ फील करना चाहिए (क्या यह इस संस्करण के साथ भी संभव है?), शायद अन्य विकल्प भी हैं। मेमकेच्ड संस्करण को अपग्रेड करना जल्दी उपलब्ध विकल्प नहीं है।

  • दूसरा सवाल, जिज्ञासा से बाहर, निश्चित रूप से है अगर 75% (और बढ़ती) व्यर्थ अंतरिक्ष की दर की उम्मीद है, और यदि हां, तो क्यों।

सिस्टम: यह वर्तमान में कुछ ऐसा नहीं है जिसके बारे में मैं कुछ भी कर सकता हूं, मुझे पता है कि मेमेकेटेड संस्करण सबसे नया नहीं है, लेकिन ये वे कार्ड हैं जिन्हें मैंने निपटाया है।

  • 1.4.5 मेमेच्ड
  • अपाचे 2.2.17
  • PHP 5.3.5

@DavidSchwartz के जवाब की प्रतिक्रिया के रूप में: यहाँ स्लैब आँकड़े हैं जो phpmemcacheadmin का उत्पादन करता है: (अधिक स्लैब btw हैं तो ये)

( मैं भी पाठ प्रारूप में थोड़ा बाद में यहाँ से आँकड़े चिपकाए हैं )

स्लैब विवरण

अपडेट करें

मैंने डेम को फिर से शुरू किया है -f 1.5 के साथ, और यह वास्तव में अच्छा लग रहा था। कुछ वार्मिंग के बाद हमने 50/50 का उपयोग / बर्बाद किया। लेकिन, पहले की तरह ही, अब हमारे पास दिन में (यह दिन के दौरान व्यस्त हो जाता है) यह वापस गिरना शुरू हो गया जो वर्तमान में है: 30/70, और बर्बाद अभी भी बढ़ रहा है। इसके अलावा, मुझे अभी भी नहीं पता है कि 'बर्बाद' कहां से आ रहा है। मैं इस स्लैब को देखता हूं:

**Slab 5 Stats**
Chunk Size  496.0 Bytes
Used Chunk  77502 [24.6 %]
Total Chunk 314986
Total Page  149
Wasted      117.3 MBytes
Hits        30.9 Request/sec
Evicted     0

यह पूर्ण नहीं है, इसका कोई सबूत नहीं है, लेकिन यह 117.3 एमबीटी को बर्बाद कर रहा है। त्वरित गणना जो मैंने की (गलत होने पर मुझे सही करें):

  • पिछले स्लैब का आकार 328 है, इसलिए सबसे खराब स्थिति इस स्लैब में 329 बाइट का हिस्सा है।
  • इसका मतलब है कि यह 167 बाइट्स प्रति यूज्ड चंक = 12942834 बाइट्स = 12.3 एमबी बर्बाद कर रहा है

तो फिर अन्य 105 एमबी बर्बाद कहां से आए? यह ठीक बड़ा भाई है, ऐसा दिखता है:

**Slab 6 Stats** 
Chunk Size  744.0 Bytes
Used Chunk  17488 [31.0 %]
Total Chunk 56360
Total Page  40
Wasted      31.1 MBytes
Hits        107.7 Request/sec
Evicted     1109

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

अच्छा बिंदु, जो निष्कासन की व्याख्या करेगा, हालांकि मुझे वास्तव में यकीन नहीं है कि 'बर्बाद' संख्या की गणना कैसे की जाती है। यदि स्लैब 8 में केवल 13.9% का उपयोग किया गया है, तो निश्चित रूप से कुछ "मुक्त" स्थान होना चाहिए?
नन्ने

हां, उस स्लैब में खाली जगह है। लेकिन अगर यह मदद नहीं करता है कि निकाले जाने वाले ऑब्जेक्ट उस स्लैब में नहीं जाते हैं।
डेविड श्वार्ट्ज

यह वही है जो मैंने आपके उत्तर से समझ लिया है, लेकिन कोई खाली स्थान सूचीबद्ध क्यों नहीं है? उस पाई-चार्ट सफेद का कुछ हिस्सा होना चाहिए (जैसा कि मेरे परीक्षण स्थापित होने पर) अगर अभी भी जगह बची है, तो कम से कम, मुझे यही लगा
नन्ने

जवाबों:


10

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

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

स्पष्टीकरण को सरल बनाने के लिए, मान लें कि आपके पास 3 एमबी रैम के साथ 3 स्लैब हैं।

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1

एक एकल "सेट" को 10k आकार के साथ निष्पादित करें। आप अपने आँकड़ों में देखेंगे (मोटे तौर पर) जो आपके पास है:

0.03% used
66.6% free
33% wasted

ऐसा इसलिए है क्योंकि मेमकाटेड को "स्लैब क्लास 1" से एक सिंगल चंक आवंटित किया गया है और उस स्लैब के लिए 99% मेमोरी "व्यर्थ" है और 1% "उपयोग" है इसका मतलब यह नहीं है कि स्लैब और उस स्लैब के लिए आवंटित मेमोरी को हटा दिया गया है।

10k आकार के साथ एक और एकल "सेट" निष्पादित करें। इस बार आप देखेंगे:

0.06% used
66.6% free
32.7% wasted

तो अब आप स्लैब 1 में 100 में से 2 आवंटित चांस का उपयोग कर रहे हैं, "व्यर्थ" आँकड़े गिरा दिए गए, और उपयोग किए गए आँकड़े बढ़ गए।

प्रयुक्त% + व्यर्थ% 100% के बराबर होने के लिए कुछ भी गलत नहीं है। इसका मतलब यह नहीं है कि आपके पास अधिक मेमोरी नहीं बची है, इसका सीधा मतलब है कि आपको प्रत्येक और हर स्लैब में से कम से कम एक हिस्सा आवंटित किया गया है।

इस मुद्दे को देखने के लिए एक "सेट" 100k आकार के साथ और दूसरा 1000k आकार के साथ

अब आप देखेंगे

36.6% used
   0% free
63.3% wasted

यह अच्छा रहेगा! क्या आपके पास इसे वापस करने के लिए कोई लिंक है? अगर ऐसा है तो इसका मतलब है कि मेरा मेमेचे-सर्वर बेहतर प्रदर्शन कर रहा है (तब) हम सोचते हैं :)। अगर मैं आपको सही ढंग से समझता हूं कि व्यर्थ का मतलब यह आवंटित किया गया है, लेकिन अभी भी उपयोग के लिए उपलब्ध है। इसका मतलब यह है कि अगर कुछ भी मुफ्त नहीं है तो आप अधिक स्लैब आवंटित नहीं कर सकते हैं, लेकिन इसका मतलब यह नहीं होना चाहिए कि आपको प्रति समस्या है?
नन

1
मेरे सिर के ऊपर एक लिंक नहीं है लेकिन खुद को परखना बहुत आसान है। अपनी कमांड लाइन को हिट करें और यह जांचने के लिए एक नमूना छोटा सर्वर बनाएं कि यह कैसे काम करता है। आप वर्बोज़ डीबग संदेशों के लिए -vv विकल्प का उपयोग कर सकते हैं, जो आपको आरंभिक निर्मित स्लैब दिखाएगा अर्थात: "memcached -vv -p 11500 -m 3 -n 10000 -f 10", आप 3 स्लैब बनाएगा, जिसमें चंक साइज़ 100k और 1000k होंगे। और "सेट" जारी करते रहें और अपने व्यर्थ / उपयोग किए गए आँकड़ों को ठीक उसी तरह देखें जैसे मैंने ऊपर वर्णित किया है।
काली जूल 5'13

अच्छी बात। अब यह पता लगाने के लिए कि मैं आपके लिए इस उत्तर पर कुछ अतिरिक्त ध्यान कैसे दे सकता हूं :)
नन

6

आपके पास शायद बहुत छोटी वस्तुओं की एक बड़ी संख्या है। आमतौर पर, सबसे छोटा स्लैब 104-बाइट प्रविष्टियाँ रखता है। यदि आपके पास बहुत सी प्रविष्टियाँ हैं जो केवल एक पूर्णांक को दूसरे में मैप करती हैं, तो आप 85% तक उच्च प्राप्त कर सकते हैं।

आप इस बारे में जानकारी पा सकते हैं कि छोटे ऑब्जेक्ट्स के लिए मेमकैच्ड लेख में इसके चारों ओर कैसे ट्यून करें ।


यदि मैं आंकड़े पृष्ठ को सही ढंग से पढ़ता हूं तो ऐसा नहीं है। अधिकांश अपशिष्ट 480.0 बाइट-चंक के साथ एक स्लैब में है। मुझे जाँचने दें कि क्या मैं कुछ आँकड़े दिखा सकता हूँ ...
नन्ने

ओह, तो यह ठीक है और सामान्य है, चिंता की कोई बात नहीं है। अभी वहां कम डेटा है। (नोटिस, उदाहरण के लिए, कि स्लैब का उपयोग केवल 14% है।)
डेविड श्वार्ट्ज

लेकिन 75% सामान्य कैसे बर्बाद होता है? क्या इस संख्या में अप्रयुक्त स्थान शामिल है? मुझे उम्मीद है कि इसे "मुक्त" के रूप में गिना जाएगा। इसके अलावा, हम व्यर्थ में वृद्धि को देखते हैं। दिन के रूप में उपयोग की जाने वाली मेमोरी में कमी होती है, जबकि साइट व्यस्त हो जाती है। यह और तथ्य यह है कि हमारे पास बेदखली है, मुझे आश्चर्य है कि क्या किया जा सकता है।
नन्हें

कम स्लैब होने से बहुत अधिक मेमोरी गलत स्लैब में फंसने की समस्या से बचा जा सकता है। उदाहरण के लिए, -f 1.5 -I 2800मदद कर सकता है।
डेविड श्वार्ट्ज

मैन-पेज बहुत स्पष्ट नहीं है: -I 28001M डिफ़ॉल्ट के विपरीत, 2800K का मतलब है?
नन्ने

-1

मेरे पास यह मुद्दा था और मेम्केड से रेडिस तक चला गया (बिना डिस्क आधारित बचत)। मुझे पता है कि यह संभव नहीं हो सकता है लेकिन आप इसे एक विकल्प के रूप में आज़मा सकते हैं और स्मृति विखंडन पर नज़र रख सकते हैं। आप पुनः आरंभ करने पर "पुराने कैश" मुद्दों को ठीक करने के लिए दृढ़ता को चालू कर सकते हैं।

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