MySQL अधिकतम मेमोरी उपयोग


111

मैं यह जानना चाहूंगा कि लिनक्स सर्वर पर MySQL की उपयोग की जाने वाली मेमोरी की मात्रा पर ऊपरी सीमा निर्धारित करना कैसे संभव है।

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


4
MySQL "हर नई क्वेरी के लिए मेमोरी नहीं लेता है और अंततः बाहर चला जाता है"। मेमोरी का उपयोग इससे कहीं अधिक जटिल है।
रिक जेम्स

जवाबों:


183

MySQL का अधिकतम मेमोरी उपयोग हार्डवेयर, आपकी सेटिंग्स और स्वयं डेटाबेस पर निर्भर करता है।

हार्डवेयर

हार्डवेयर स्पष्ट हिस्सा है। जितना अधिक उतना तेजी से डिस्क राम FTW । हालांकि उन मासिक या साप्ताहिक समाचार पत्रों पर विश्वास न करें। MySQL रेखीय पैमाने पर नहीं है - Oracle हार्डवेयर पर भी नहीं। यह उससे थोड़ा पेचीदा है।

लब्बोलुआब यह है: आपके MySQL सेटअप के लिए अनुशंसा के लिए अंगूठे का कोई सामान्य नियम नहीं है । यह सब वर्तमान उपयोग या अनुमानों पर निर्भर करता है।

सेटिंग्स और डेटाबेस

MySQL अपने व्यवहार को अनुकूलित करने के लिए अनगिनत चर और स्विच प्रदान करता है। यदि आप मुद्दों में भाग लेते हैं, तो आपको वास्तव में बैठना और (f'ing) मैनुअल पढ़ना होगा।

डेटाबेस के लिए के रूप में - कुछ महत्वपूर्ण बाधाओं:

  • तालिका इंजन ( InnoDB, MyISAM, ...)
  • आकार
  • सूचकांक
  • प्रयोग

स्टैकओवरफ्लो पर अधिकांश MySQL टिप्स आपको 5-8 के बारे में बताएंगे जो कि महत्वपूर्ण सेटिंग्स कहलाते हैं। सबसे पहले, उन सभी को कोई फर्क नहीं पड़ता - जैसे कि बहुत सारे संसाधनों को आवंटित करना InnoDB और InnoDB का उपयोग नहीं करना बहुत मायने नहीं रखता है क्योंकि उन संसाधनों को बर्बाद किया जाता है।

या - बहुत से लोग max_connectionवैरिएबल का सुझाव देते हैं - ठीक है, बहुत कम लोग जानते हैं कि इसका मतलब यह भी है कि MySQL उन लोगों को पूरा करने के लिए और अधिक संसाधन आवंटित करेगा max_connections- यदि कभी आवश्यक हो। अधिक स्पष्ट समाधान आपके DBAL में डेटाबेस कनेक्शन को बंद करने या wait_timeoutउन थ्रेड्स को खाली करने के लिए कम हो सकता है ।

यदि आप मेरे बहाव को पकड़ते हैं - वास्तव में बहुत कुछ है, बहुत कुछ पढ़ना और सीखना है।

इंजन

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

मैं कहना है मतलब यह नहीं है MyISAM बेकार है , लेकिन InnoDBजवाब के लिए बदलाव किया जा सकता है लगभग या लगभग जितनी जल्दी MyISAMऔर प्रस्तावों पर पंक्ति-लॉकिंग के रूप में ऐसी बात UPDATEहै, जबकि MyISAMताले पूरे तालिका जब यह करने के लिए लिखा है।

यदि आप अपने स्वयं के बुनियादी ढाँचे पर MySQL को चलाने के लिए स्वतंत्र हैं, तो आप percona सर्वर की जाँच भी कर सकते हैं क्योंकि Facebook और Google जैसी कंपनियों के बहुत से योगदानों में से (वे तेजी से जानते हैं), इसमें Percona की स्वयं की ड्रॉप भी शामिल है- प्रतिस्थापन के लिए InnoDBकहा जाता है, XtraDB

Percona-server (और -client) सेटअप (उबंटू पर) के लिए मेरा जिस्ट देखें: http://gist.github.com/637669

आकार

डेटाबेस का आकार बहुत महत्वपूर्ण है, यह विश्वास है या नहीं - इंटर्वेब पर ज्यादातर लोगों ने कभी भी एक बड़े को संभाला नहीं है और गहन MySQL सेटअप लिखते हैं, लेकिन वे वास्तव में मौजूद हैं। कुछ लोग ट्रोल करेंगे और कुछ ऐसा कहेंगे, जैसे "PostgreSQL का उपयोग करें !!! 111", लेकिन अभी के लिए उन्हें अनदेखा कर दें।

लब्बोलुआब यह है: आकार से देखते हुए, हार्डवेयर के बारे में निर्णय किया जाना है। आप वास्तव में 1 जीबी रैम पर 80 जीबी डेटाबेस को तेजी से नहीं चला सकते हैं।

सूचकांकों

यह नहीं है: अधिक, विलय। केवल आवश्यक सूचकांकों को सेट किया जाना है और उपयोग के साथ जांच की जानी है EXPLAIN। इसमें जोड़ें कि MySQL EXPLAINवास्तव में सीमित है, लेकिन यह एक शुरुआत है।

सुझाए गए कॉन्फ़िगरेशन

इन my-large.cnfऔर my-medium.cnfफाइलों के बारे में - मुझे यह भी नहीं पता कि ये किसके लिए लिखे गए थे। अपना खुद का रोल करें।

ट्यूनिंग प्राइमर

एक शानदार शुरुआत ट्यूनिंग प्राइमर है । (: यदि आप लिनक्स की आवश्यकता होगी संकेत), जो के उत्पादन में ले जाता है यह एक bash स्क्रिप्ट है SHOW VARIABLESऔर SHOW STATUSऔर उम्मीद है कि उपयोगी सिफारिश में यह गिर्द घूमती है। यदि आपका सर्वर कुछ समय चला है, तो सिफारिश बेहतर होगी क्योंकि उन्हें आधार बनाने के लिए डेटा होगा।

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

पढ़ना

मैं वास्तव में mysqlperformanceblog की सिफारिश करना पसंद करता हूं । यह MySQL से संबंधित सभी प्रकार के सुझावों के लिए एक शानदार संसाधन है। और यह सिर्फ MySQL नहीं है, वे सही हार्डवेयर के बारे में भी बहुत कुछ जानते हैं या एडब्ल्यूएस आदि के लिए सेटअप की सिफारिश करते हैं। इन लोगों के पास वर्षों और वर्षों का अनुभव है।

एक अन्य महान संसाधन ग्रह-माईस्कल है


मैं इस बारे में नहीं जानता tuning primerकि यह कैसे तुलना करता है mysqltuner?
greg0ire

38

हम इन सेटिंग्स का उपयोग करते हैं:

etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100

निम्नलिखित विशिष्टताओं वाले सर्वर के लिए:

Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA

16
मुझे लगता है कि आप (और आपके द्वारा लिंक किए गए लेखक) के पास गलत तरीके से query_cache_size और query_cache_limit है। आप MySQL से कह रहे हैं: 1MB कैश आवंटित करें, लेकिन इसमें कोई प्रश्न न रखें जो 128MB से बड़ा हो। dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
agtb

मैं max_connections को कम करूंगा। मैं तय करूंगा कि किस इंजन का उपयोग करना है, और दोनों के लिए बहुत सारे स्थान आवंटित नहीं करना है।
रिक जेम्स

19

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

यदि आप वास्तव में एक कठिन सीमा लागू करना चाहते हैं, तो आप ऐसा कर सकते हैं, लेकिन आपको इसे ओएस स्तर पर करना होगा क्योंकि कोई अंतर्निहित सेटिंग नहीं है। Linux में, आप ulimit का उपयोग कर सकते हैं , लेकिन आपको इसे लगाने के लिए MySQL शुरू करने के तरीके को संशोधित करना होगा।


सबसे अच्छा उपाय यह है कि आप अपने सर्वर को ट्यून करें, ताकि सामान्य MySQL मेमोरी सेटिंग्स के संयोजन से आम तौर पर कम मेमोरी का उपयोग आपके SQL इंस्टॉलेशन द्वारा किया जा सके। यह निश्चित रूप से आपके डेटाबेस के प्रदर्शन पर नकारात्मक प्रभाव डालेगा, लेकिन कुछ सेटिंग्स जिन्हें आप ट्विक कर सकते my.iniहैं:

key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size

मैं वहां से शुरू करूंगा और देखूंगा कि क्या आपको मनचाहे परिणाम मिल सकते हैं। रहे हैं कई लेख MySQL स्मृति समायोजित करने के बारे वहाँ बाहर।


संपादित करें:

ध्यान दें कि MySQL के नए 5.1.x रिलीज़ में कुछ परिवर्तनशील नाम बदल गए हैं

उदाहरण के लिए:

table_cache

अब है:

table_open_cache

2
नमस्ते! आपके उत्तर के लिए धन्यवाद। मैंने देखा है कि लोगों द्वारा बोली जाने वाला समीकरण निम्न है: key_buffer_size + (read_buffer_size + Sort_buffer_size) * max_connections = कुल मेमोरी। मैंने निम्नलिखित सेट किया है: key_buffer_size = 128M, read_buffer_size = 1M, sort_buffer_size = 2M, max_connections = 120, और सर्वर पर कुल मेमोरी 512M है। हालांकि, कई प्रश्नों के बाद, मुफ्त मेमोरी 12M के रूप में कम हो गई है और संभवतः आगे के उपयोग के साथ नीचे जाना जारी रखेगा। क्या ऐसा होने का कोई कारण है और क्या इसे रोका जा सकता है? धन्यवाद!

या शायद मुझे सर्वर (512M) पर कुल मेमोरी नहीं बल्कि मुफ्त मेमोरी (यानी सभी ओएस से संबंधित और अन्य कार्यक्रमों को लोड करने के बाद उपलब्ध मेमोरी) को ध्यान में रखना होगा?

1
यदि आप tmp_table_size को संशोधित करने के इरादे से जा रहे हैं, तो RAM में स्टोर की जा सकने वाली टेम्‍प टेबल के आकार को बढ़ाने के लिए, याद रखें कि max_heap_table_size को भी बढ़ाएं - जैसा कि MySQL दो में से कम से कम उपयोग करता है ...
डेव रिक्स

1
@TimothyMilsud - जैसा कोई फॉर्मूला वास्तव में काम नहीं करता है। और ज्यादातर सर्वर काफी ठीक चलते हैं जब एक फॉर्मूला दावा करता है कि बहुत अधिक रैम का उपयोग किया जा रहा है।
रिक जेम्स

19

mysqld.exe RAM में 480 mb का उपयोग कर रहा था। मैंने पाया कि मैंने इस पैरामीटर को my.ini में जोड़ दिया है

table_definition_cache = 400

कि स्मृति का उपयोग 400,000+ kb से घटकर 105,000kb से कम हो गया है


यह किस धारा के तहत होता है? मैंने इसे अपने साथ जोड़ा और सेवा शुरू करने से इनकार कर दिया।
सिंटैक्स एरर

कोई बात नहीं, मैंने इसे [wampmysqld] के तहत स्थानांतरित कर दिया और इसने बहुत अच्छा काम किया और उस मेमोरी को कम कर दिया जिसका मैं काफी उपयोग कर रहा था। मुझे लगता है कि इसने इस प्रक्रिया में मेरे लोकलहोस्ट पगेलॉड को भी उकसाया होगा, वे अब और तेज हो गए हैं।
सिंटैक्स एरर

हालांकि डिफ़ॉल्ट और न्यूनतम 400 है, क्या यह आपके मामले में 400 से अधिक लाया?
वाडीह एम।

5

में /etc/my.cnf:

[mysqld]
...

performance_schema = 0

table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000

query_cache_size = 0
query_cache_limit = 0

...

256MB मेमोरी वाले सर्वर पर अच्छा काम।


क्यों table_definition_cache= ० है? कुछ स्पष्टीकरण अच्छा होगा। और आप मूल रूप से प्रश्नों को कैशिंग नहीं कर रहे हैं ... एक ही प्रभाव अगर आप query_cache_type = 0:)
खोम नाज़िद

0

यदि आप अपने docker mysql कंटेनर को अनुकूलित करने की तलाश में हैं, तो नीचे दी गई कमांड मदद कर सकती है। मैं एक डिफ़ॉल्ट 480mb से मात्र 100 mbs तक mysql docker कंटेनर चलाने में सक्षम था

docker run -d 330p: 3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = test -e MYSQL_PASSWORD- परीक्षण -v / mysql: / var / lib / mysql --name mysqldb mysqlb --performance_schema = 0 --default-Authent-plugin = mysql_native_password

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