MySQL: मैं अपना "अधिकतम संभव मेमोरी उपयोग" कैसे प्राप्त कर सकता हूं?


16

स्मृति से बाहर भागने के परिणामस्वरूप मुझे हाल ही में थ्रेशिंग की समस्या हो रही है। (मेरे वीपीएस में कुल 256M है)

मैं mysqltuner.pl का उपयोग करके MySQL को ट्यून करने की कोशिश कर रहा हूं, और निम्नलिखित परिणाम प्राप्त कर सकता हूं:

-------- सामान्य सांख्यिकी ---------------------------------------- ----------
[-] MySQLTuner स्क्रिप्ट के लिए छोड़ दिया गया संस्करण जाँच
[ठीक है] वर्तमान में समर्थित MySQL संस्करण 5.0.51a-3ubuntu5.4-log
[ठीक है] 64-बिट आर्किटेक्चर पर काम कर रहा है

-------- संग्रहण इंजन सांख्यिकी --------------------------------------- ----
[-] स्थिति: + पुरालेख -BDB -Federated -InnoDB -ISAM -NDBCluster 
[-] MyISAM तालिकाओं में डेटा: 114M (तालिकाएँ: 454)
[!!] कुल खंडित सारणी: ३४

-------- प्रदर्शन मेट्रिक्स ---------------------------------------- ---------
[-] के लिए: ४० के दशक (५ 570० q [१४.२५० qps], २३ कॉन, TX: १५४ के, RX: २३K)
[-] पढ़ता / लिखता है: १००% / ०%
[-] कुल बफ़र: 338.0M वैश्विक + 2.7M प्रति थ्रेड (20 अधिकतम धागे)
[!!] अधिकतम संभव मेमोरी उपयोग: 392.9M (स्थापित रैम का 153%)
[ठीक] धीमी क्वेरी: 0% (5/570)
[ठीक है] उपलब्ध कनेक्शन का उच्चतम उपयोग: १५% (३/२०)
[!!] कुंजी बफर आकार / कुल MyISAM सूचकांक: 8.0M / 9.4M
[!!] प्रमुख बफर हिट दर: 57.1% (7 कैश्ड / 3 रीड्स)
[ठीक] क्वेरी कैश दक्षता: 21.9% (7 कैश / 32 चयन)
[ठीक है] क्वेरी कैश प्रति दिन prunes: 0
[ठीक है] अस्थायी तालिकाओं की आवश्यकता वाले रिसॉर्ट्स: 0% (0 अस्थायी प्रकार / 1 प्रकार)
[ठीक है] डिस्क पर बनाई गई अस्थायी तालिकाएँ: 0% (डिस्क पर 32 कुल)
[ठीक] थ्रेड कैश हिट दर: 86% (3 निर्मित / 23 कनेक्शन)
[ठीक] टेबल कैश हिट दर: २६% (१२] खुला / ४ opened४ खोला)
[ठीक] खुली फ़ाइल सीमा का उपयोग: २५% (२५ ९ / १ के)
[ठीक] टेबल तालों को तुरंत अधिग्रहीत किया गया: १००% (४ ९ २ तात्कालिक / ४ ९ २ ताले)

-------- सिफारिशें ----------------------------------------- ------------
सामान्य सिफारिशें:
    बेहतर प्रदर्शन के लिए डीफ़्रेग्मेंट टेबल पर ऑप्टिमाइज़ टेबल चलाएँ
    MySQL पिछले 24 घंटों के भीतर शुरू हुआ - सिफारिशें गलत हो सकती हैं
    सिस्टम स्थिरता के लिए अपने समग्र MySQL स्मृति पदचिह्न को कम करें
चर समायोजित करने के लिए:
  *** MySQL का अधिकतम मेमोरी उपयोग खतरनाक रूप से उच्च है ***
  *** MySQL बफर चर बढ़ाने से पहले RAM जोड़ें ***
    key_buffer_size (> 9.4M)

लेकिन मैं थोड़ा उलझन में हूं कि अधिकतम मेमोरी का उपयोग कैसे किया जाए? यह key_buffer और max_connections पर आधारित लगता है, लेकिन इसमें कुछ और भी शामिल होना चाहिए?

my.cnf:

key_buffer = 8M
max_allowed_packet = 12M
थ्रेड_स्टैक = 128 के
thread_cache_size = 8
max_connections = 20
table_cache = 128
tmp_table_size = 256M
max_heap_table_size = 256M
join_buffer_size = 256K
query_cache_limit = 8M
query_cache_size = 64M

मैं MySQL ट्यूनिंग लेखों के माध्यम से पढ़ने की कोशिश कर रहा हूं, लेकिन वे ऐसे लोगों की ओर देखते हैं जो पहले से ही जानते हैं कि वे क्या कर रहे हैं! किसी भी सहायता की सराहना की जाएगी। धन्यवाद!


1
मैंने टिप्पणी करने वाले की सलाह का पालन किया और इसे एक उचित स्तर पर लाया- लेकिन मैं अभी भी इस बात को लेकर उत्सुक हूं कि उन मूल्यों के लिए कौन सा समझदार हो सकता है? कुछ लेख ऑनलाइन 64K का उपयोग करते हैं और अन्य समान मूल्य के लिए 512M सुझाते हैं!
निक

जवाबों:


10

आपके पास 256M के साथ एक सर्वर है, लेकिन आप उस सब का उपयोग नहीं कर सकते हैं - याद रखें कि कुछ ओएस ओवरहेड है। इस तथ्य के साथ जोड़ें कि आप खत्म कर रहे हैं जैसा कि अन्य लोगों ने उल्लेख किया है और आप निश्चित रूप से यहां थ्रश करेंगे। 256M केवल एक छोटे DB के लिए पर्याप्त है, 20 कनेक्शन बहुत कुछ है जो आपने कॉन्फ़िगर किया है।

1) अपने अधिकतम कनेक्शन को कम करके ४ (आप २० में से ३ का उपयोग कर रहे हैं)

2) अपने क्वेरी कैश को बेहतर तरीके से अनुकूलित करें; 8M वास्तव में बड़ा है, और 64M कुल आपके हिट्स / prunes के आधार पर बहुत कुछ है; 4/32 कॉम्बो आज़माएं और देखें कि यह कैसे जाता है। वास्तव में मुझे लगता है कि 2/24 कॉम्बो आपके लिए काम करेगा।

3) आपको किसी प्रकार की टेम्परिंग टेबल की आवश्यकता नहीं है, क्यों वहाँ पर max_heap_table_size क्रिया है? टिप्पणी करें कि बाहर, चूक का उपयोग करें

4) क्या आपके पास वास्तव में 128 टेबल हैं? आधे से 64 या 48 में उस टेबल_चे को काटने की कोशिश करें

५) थ्रेड_चेचे_साइज़ को ४ तक कम करें

6) टुकड़े को कम करने के लिए उन तालिकाओं का अनुकूलन करें

उन कुछ चीजों के साथ शुरू करने के लिए कर रहे हैं। ऐसा लगता है कि आपने किसी भी वास्तविक प्रोफाइलिंग के बिना एक विन्यास में संख्याओं का एक गुच्छा फेंक दिया है ताकि आपको पता चले कि आपको क्या ज़रूरत है और एक गड़बड़ पैदा हुई है; यदि बाकी सभी विफल हो जाते हैं, तो डिफ़ॉल्ट पर वापस जाएं और अपनी कस्टम सेटिंग्स से छुटकारा पाएं और कुछ प्रदर्शन ट्यूनिंग गाइडों का उपयोग करके शुरू करें जिन्हें आप Google पर पा सकते हैं। SHOW VARIABLES और SHOW STATUS का आउटपुट प्राप्त करें, किसी भी bajillion ट्यूनिंग मार्गदर्शिका में से किसी एक को ढूंढें और अपने वास्तविक, वास्तविक संख्याओं को उनके समीकरणों में प्लग करें और यह आपको सटीक-ish नंबर बताएगा जिसे आपको अपनी कॉन्फ़िग फ़ाइल में डालने की आवश्यकता है।


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

8

मैं एक MySQL गुरु नहीं हूं और मैं इस जानकारी के साथ समस्या का निदान नहीं कर सकता, लेकिन मैंने स्रोत कोड में सूत्र की खोज करने की कोशिश की। यह रहा:

server_buffers + total_per_thread_buffers * max_connections

कहाँ पे:

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

तथा:

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + max_allowed_packet + join_buffer_size

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

सौभाग्य!


0

यदि मुझे सही याद है, तो MySQL ट्यूनर अधिकतम उपयोग का अनुमान लगाने के लिए निम्न सूत्र का उपयोग करता है:

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

ध्यान रखें कि यह 100% सही नहीं है, और वास्तव में सिर्फ एक अनुमान है, क्योंकि MySQL में कुछ सेटिंग्स की कोई निर्धारित सीमा नहीं है।

आप अपनी कॉन्फिग फ़ाइल में कुछ सेटिंग्स को टोन करना शुरू कर सकते हैं और ट्यूनर को फिर से चला सकते हैं, लेकिन अगर आपको my.cnf को बदलने, इसे फिर से शुरू करने और ट्यूनर को चलाने में समय बर्बाद नहीं करना है, तो मैं एक विशेषज्ञ की सहायता लेने की सलाह दूंगा।


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