MySQL InnoDB बफर पूल उदाहरणों की इष्टतम संख्या


13

सर्वर विशेषताएँ

  • कुल सिस्टम RAM: 8GB (MySQL की तुलना में MySQL + अन्य सामान पर चलना यानी MySQL के लिए समर्पित नहीं)
  • सीपीयू कोर की संख्या: 6
  • मेरे पास db में लगभग 2GB तक डेटा है
  • मैं InnoDB बफर पूल आकार 4GB करने के लिए सेट है

कौनसा अच्छा है:

  • इनोडब बफर पूल उदाहरण 1 पर सेट है?
  • इनोडब बफर पूल इंस्टेंस 2 (प्रत्येक में 2 जीबी) पर सेट है?
  • इनोडब बफर पूल इंस्टेंस 4 में सेट (प्रत्येक में 1 जीबी)?
  • Innodb बफर पूल के लिए 8 सेट (डिफ़ॉल्ट सेटिंग)

मैं इस प्रकार निश्चित नहीं हूं कि जब यह बफ़र पूल इंस्टेंस के लिए आता है, तो यह भी सुनिश्चित नहीं होता है कि इतने बड़े इनोबेड बफ़र पूल साइज़ होने पर "पूरे इंस्टेंस का उपयोग करें या ओएस स्वैप को पीड़ित करें"।


इतने बड़े InnoDB बफ़र पूल साइज़ होने पर आपको "उपयोग उदाहरणों का सामना करना पड़ा या OS स्वैप का नुकसान" कहां से हुआ?
रिक जेम्स

कुल बफर_पुल के लिए 70% RAM "MySQL की तुलना में अन्य सामान" के लिए स्थान को घटाने के बाद , उदाहरणों की संख्या की परवाह किए बिना, ठीक होना चाहिए।
रिक जेम्स

मैं अभी तक स्वीकार किए गए किसी भी जवाब को सेट नहीं कर सकता क्योंकि मैं उन सभी को "कूल्हे से गोली मारना" चाहता हूं। अगर किसी को आश्चर्य होता है, तो मैं 4 जी बफर पूल आकार और 2 उदाहरणों के साथ गया था और यह डेबियन 8.1 पर बहुत अच्छी तरह से काम करता है जिसमें एक ही मशीन पर कुल मेमोरी 8p के साथ php-fpm + nginx है लगभग 60 प्रश्नों / सेकंड के औसत पर चलने वाला mysql।
एनागार्ड

जवाबों:


7

जब मैं MySQL 5.5 पर वापस जाता हूं, तो मैं इसी बात के बारे में सोचूंगा।

मैंने उन वर्षों में जो सीखा वह निम्नलिखित था: यदि बफ़र पूल आधे स्थापित रैम से बड़ा था और innodb_buffer_pool_instances 1 (5.5 के लिए डिफ़ॉल्ट) था, तो स्वैपिंग का खतरा हमेशा आसन्न था।

मैंने पहले इस पर चर्चा की: क्या बफर पूल उदाहरणों के आकार और संख्या के बारे में अंगूठे का एक नियम है? । उस पोस्ट में, मैंने एक क्लाइंट का उदाहरण दिया, जिसके पास 162GB बफर पूल के साथ सर्वर पर 192GB RAM थी। जब innodb_buffer_pool_instances 1 था, तो स्वैपिंग हुई। जब मैंने innodb_buffer_pool_instances 2 पर सेट किया , तो चीजें बेहतर तरीके से हो गईं

आपके मामले में, चूंकि बफ़र पूल ठीक आधा है, 1 का मान ठीक हो सकता है। मैं इसका मौका नहीं दूंगा। मैं इसे 2 पर सेट करूंगा।

चूंकि MySQL 5.6 का डिफ़ॉल्ट 8 है, आपको इसके बारे में अब और नहीं सोचना चाहिए।

मैं यह कहूंगा: akuzminsky के उत्तर में सबसे अधिक सिद्धांत है । मेरा जवाब सिर्फ पिछले अनुभवों (अच्छे और बुरे) पर आधारित हिप से शूटिंग है।


बिल्कुल नहीं! स्वैपिंग मेमोरी की मात्रा पर निर्भर है, पूल के उदाहरणों पर नहीं।
रिक जेम्स

डिफ़ॉल्ट को जानना अच्छा है 8 ... लेकिन क्या अंतर है अगर इसे 4 में कटौती की गई या 16 हो गई? क्या कोई मेमोरी / स्टोरेज पेनल्टी या लाभ है? एकमात्र कारण मैं वास्तव में यहाँ हूँ, mysqltuner innodb_buffer_pool_instances (= 1) की सिफारिश करता है, लेकिन मैं हमेशा इसकी सिफारिशों पर भरोसा नहीं करता। दी, मैं परेशान नहीं हूँ, बस उत्सुक हूँ।
पीजे ब्रुनेट

@PJBrunet यदि InnoDB बफ़र पूल RAM के आधे से कम है, तो InnoDB बफ़र पूल इंस्टेंसेस 1. पर छोड़ा जा सकता है
RolandoMySQLDBA

6

बफर पूल म्यूटेक्स विवाद से बचने के लिए बफर पूल के उदाहरणों की संख्या बढ़ाई जानी चाहिए।

बफ़र पूल आकार 8GB के साथ मुझे संदेह है कि आप कभी बफ़र पूल म्यूटेक्स विवाद देखेंगे।

अद्यतन 0 :

मैं उत्तर में 8 जीबी बफर पूल का उल्लेख करता हूं जबकि मूल प्रश्न में कुल मेमोरी 8 जीबी थी। ज़रूर, बफर पूल 8GB से कम होना चाहिए। 4GB एक अच्छी शुरुआत की तरह लगता है लेकिन सुनिश्चित करें कि कोई भी स्वैपिंग न हो।

अद्यतन 1 :

// यासुफ़ुमी की स्लाइड्स से (हाल के MySQL संस्करणों में आउटपुट थोड़ा भिन्न हो सकता है)

यह निर्धारित करने के लिए SHOW ENGINE INNODB STATUSकि पीक समय के दौरान बफर पूल म्यूटेक्स पर एक विवाद है या नहीं, दर्जनों नमूने एकत्र करें ।

फिर इसे शेल स्निपेट का उपयोग करके एकत्रित करें:

#!/bin/sh
cat $1.innodb | grep "Mutex at " | cut -d"," -f1 | sort | uniq -c > /tmp/tmp1.txt 
cat $1.innodb | grep "lock on " | cut -d"-"
-f2- | sort | uniq -c > /tmp/tmp2.txt
cat /tmp/tmp1.txt /tmp/tmp2.txt | sort -n > $1.contention rm /tmp/tmp1.txt /tmp/tmp2.txt

जो इस तरह से उत्पादन देता है:

.....
4 lock on RW-latch at 0x7fb86b2c9138 created in file dict/dict0dict.c line 1356
6 lock on RW-latch at 0x7fb86b2c4138 created in file dict/dict0dict.c line 1356
12 lock on RW-latch at 0x7fb86b2d9538 created in file dict/dict0dict.c line 1356
20 lock on RW-latch at 0x7fb86b2db138 created in file dict/dict0dict.c line 1356
22 Mutex at 0x7fb86b28f0e0 created file btr/btr0sea.c line 139
30 lock on RW-latch at 0x7fb86b2ba938 created in file dict/dict0dict.c line 1356
36 lock on RW-latch at 0x7fb86b2bad38 created in file dict/dict0dict.c line 1356
71 Mutex at 0x7fb86b28ecb8 created file buf/buf0buf.c line 597
164 lock on RW-latch at 0x7fb86b28f0b8 created in file btr/btr0sea.c line 139

यदि आपको बफ़र पूल म्यूटेक्स प्रतीक्षा की उच्च गिनती दिखाई देती है, तो यह कई बफ़र पूल उदाहरणों पर विचार करने का समय है। विवाद ~ 48 जी से छोटे बफर पूल पर होने की संभावना नहीं है।


1
लेकिन केवल 8GB RAM में 8G बफर_पूल नहीं है!
रिक जेम्स

किस अंतर पर यानी इनसोडब बफर पूल का आकार आप उदाहरणों के बारे में सोचना शुरू करेंगे ? मैं आपके उत्तर की व्याख्या करता हूं कि इन अपेक्षाकृत छोटे स्तरों पर, एक से अधिक होने का कोई कारण नहीं है। सही बात? आपको ऐसा होने पर एक स्रोत मिला? MySQL डॉक्यूमेंटेशन "मल्टी गीगाबाइट" को कहता है - जो मेरे लिए - चीजों को व्यक्त करने का एक बहुत ही अजीब तरीका है। वास्तव में, 2 जीबी बहु है, लेकिन मुझे लगता है कि वे इससे बड़े डेटासेट का उल्लेख करते हैं ...
Adergaard

2

यदि आपका OS ऐसा है, तो "स्वैगनेस" को 1 पर सेट करें। समस्या अत्यधिक आक्रामक OOM हो सकती है।


0

मैं यह सुझाव देना चाहूंगा कि आप एक साथ चलाने के लिए अधिकतम संख्या में MySQL थ्रेड्स से मिलान कर सकें। मैं कोर की संख्या का उपयोग करता हूं।

मैंने इस नंबर को सेट innodb_read_io_threadsऔर innodb_write_io_threadsमैच भी किया ।

यदि innodb_buffer_pool_instancesबहुत कम है, तो आपके थ्रेड्स सेमाफोर वेट में फंसने की संभावना है। यह सीपीयू और आई / ओ दोनों को निष्क्रिय बनाता है, भले ही सिस्टम व्यस्त होना चाहिए - और आपका आवेदन विलंबता छत के माध्यम से जाएगा।

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