Mysql innodb_buffer_pool_size कितना बड़ा होना चाहिए?


170

मेरे पास पूरी तरह से InnoDB तालिकाओं के साथ एक व्यस्त डेटाबेस है जो आकार में लगभग 5GB है। डेटाबेस SSD डिस्क का उपयोग करते हुए एक डेबियन सर्वर पर चलता है और मैंने अधिकतम कनेक्शन = 800 सेट किया है जो कभी-कभी संतृप्त होता है और सर्वर को रोकने के लिए पीसता है। प्रति सेकंड औसत क्वेरी लगभग 2.5K है। इसलिए मुझे अधिकतम संभव कनेक्शन के लिए जगह बनाने के लिए मेमोरी उपयोग को अनुकूलित करना होगा।

मैंने सुझाव दिया है कि innodb_buffer_pool_size कुल मेमोरी का 80% तक होना चाहिए। दूसरी ओर मुझे ट्यूनिंग-प्राइमर स्क्रिप्ट से यह चेतावनी मिलती है:

Max Memory Ever Allocated : 91.97 G
Configured Max Per-thread Buffers : 72.02 G
Configured Max Global Buffers : 19.86 G
Configured Max Memory Limit : 91.88 G
Physical Memory : 94.58 G

यहाँ मेरे वर्तमान असंख्य चर हैं:

| innodb_adaptive_flushing                          | ON                                                                                                                     |
| innodb_adaptive_hash_index                        | ON                                                                                                                     |
| innodb_additional_mem_pool_size                   | 20971520                                                                                                               |
| innodb_autoextend_increment                       | 8                                                                                                                      |
| innodb_autoinc_lock_mode                          | 1                                                                                                                      |
| innodb_buffer_pool_instances                      | 1                                                                                                                      |
| innodb_buffer_pool_size                           | 20971520000                                                                                                            |
| innodb_change_buffering                           | all                                                                                                                    |
| innodb_checksums                                  | ON                                                                                                                     |
| innodb_commit_concurrency                         | 0                                                                                                                      |
| innodb_concurrency_tickets                        | 500                                                                                                                    |
| innodb_data_file_path                             | ibdata1:10M:autoextend                                                                                                 |
| innodb_data_home_dir                              |                                                                                                                        |
| innodb_doublewrite                                | ON                                                                                                                     |
| innodb_fast_shutdown                              | 1                                                                                                                      |
| innodb_file_format                                | Antelope                                                                                                               |
| innodb_file_format_check                          | ON                                                                                                                     |
| innodb_file_format_max                            | Antelope                                                                                                               |
| innodb_file_per_table                             | ON                                                                                                                     |
| innodb_flush_log_at_trx_commit                    | 2                                                                                                                      |
| innodb_flush_method                               | O_DIRECT                                                                                                               |
| innodb_force_load_corrupted                       | OFF                                                                                                                    |
| innodb_force_recovery                             | 0                                                                                                                      |
| innodb_io_capacity                                | 200                                                                                                                    |
| innodb_large_prefix                               | OFF                                                                                                                    |
| innodb_lock_wait_timeout                          | 50                                                                                                                     |
| innodb_locks_unsafe_for_binlog                    | OFF                                                                                                                    |
| innodb_log_buffer_size                            | 4194304                                                                                                                |
| innodb_log_file_size                              | 524288000                                                                                                              |
| innodb_log_files_in_group                         | 2                                                                                                                      |
| innodb_log_group_home_dir                         | ./                                                                                                                     |
| innodb_max_dirty_pages_pct                        | 75                                                                                                                     |
| innodb_max_purge_lag                              | 0                                                                                                                      |
| innodb_mirrored_log_groups                        | 1                                                                                                                      |
| innodb_old_blocks_pct                             | 37                                                                                                                     |
| innodb_old_blocks_time                            | 0                                                                                                                      |
| innodb_open_files                                 | 300                                                                                                                    |
| innodb_purge_batch_size                           | 20                                                                                                                     |
| innodb_purge_threads                              | 0                                                                                                                      |
| innodb_random_read_ahead                          | OFF                                                                                                                    |
| innodb_read_ahead_threshold                       | 56                                                                                                                     |
| innodb_read_io_threads                            | 4                                                                                                                      |
| innodb_replication_delay                          | 0                                                                                                                      |
| innodb_rollback_on_timeout                        | OFF                                                                                                                    |
| innodb_rollback_segments                          | 128                                                                                                                    |
| innodb_spin_wait_delay                            | 6                                                                                                                      |
| innodb_stats_method                               | nulls_equal                                                                                                            |
| innodb_stats_on_metadata                          | ON                                                                                                                     |
| innodb_stats_sample_pages                         | 8                                                                                                                      |
| innodb_strict_mode                                | OFF                                                                                                                    |
| innodb_support_xa                                 | ON                                                                                                                     |
| innodb_sync_spin_loops                            | 30                                                                                                                     |
| innodb_table_locks                                | ON                                                                                                                     |
| innodb_thread_concurrency                         | 4                                                                                                                      |
| innodb_thread_sleep_delay                         | 10000                                                                                                                  |
| innodb_use_native_aio                             | ON                                                                                                                     |
| innodb_use_sys_malloc                             | ON                                                                                                                     |
| innodb_version                                    | 1.1.8                                                                                                                  |
| innodb_write_io_threads                           | 4                                                                                                                      |

एक साइड नोट जो प्रासंगिक हो सकता है: मैं देखता हूं कि जब मैं एक बड़े पोस्ट (10KB से अधिक) को Drupal (जो एक अलग वेब सर्वर पर बैठता है) से डेटाबेस में डालने की कोशिश करता हूं, तो यह हमेशा के लिए रहता है और पेज सही से वापस नहीं आता है।

इन के बारे में, मैं सोच रहा हूँ कि इष्टतम प्रदर्शन के लिए मेरा innodb_buffer_pool_size क्या होना चाहिए। मैं इस परिदृश्य के लिए इस और अन्य मापदंडों को निर्धारित करने के लिए आपके सुझावों की सराहना करता हूं।

जवाबों:


252

आपका innodb_buffer_pool_size बहुत बड़ा है। आपने इसे निर्धारित किया है 20971520000। जो कि 19.5135 जीबी है। यदि आप केवल 5GB InnoDB डेटा और इंडेक्स बनाते हैं, तो आपके पास केवल 8GB होना चाहिए। यहां तक ​​कि यह बहुत अधिक हो सकता है।

यहाँ है कि आपको क्या करना चाहिए। सबसे पहले इस क्वेरी को चलाएँ

SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;

यह आपको अतिरिक्त 60% के साथ सभी InnoDB डेटा और इंडेक्स पर आधारित RIBPS, अनुशंसित InnoDB बफर पूल आकार देगा।

उदाहरण के लिए

mysql>     SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
    ->     (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
    ->     FROM information_schema.tables WHERE engine='InnoDB') A;
+-------+
| RIBPS |
+-------+
|     8 |
+-------+
1 row in set (4.31 sec)

mysql>

इस आउटपुट के साथ, आप /etc/my.cnf में निम्नलिखित सेट करेंगे

[mysqld]
innodb_buffer_pool_size=8G

आगे, service mysql restart

पुनरारंभ करने के बाद, एक या दो सप्ताह के लिए mysql चलाएं। फिर, यह क्वेरी चलाएँ:

SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM
(SELECT variable_value PagesData
FROM information_schema.global_status
WHERE variable_name='Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize
FROM information_schema.global_status
WHERE variable_name='Innodb_page_size') B;

यह आपको बताएगा कि इस समय InnoDB बफ़र पूल में InnoDB डेटा द्वारा कितनी वास्तविक GB मेमोरी का उपयोग किया गया है।

मैंने इसके बारे में पहले भी लिखा है: innodb_buffer_pool सेट करने के लिए और क्यों ..?

आप इस DataGBक्वेरी को अभी पुन: कॉन्फ़िगर करने, पुनः आरंभ करने और एक सप्ताह की प्रतीक्षा करने के बजाय चला सकते हैं।

यह मान DataGBऔर अधिक बारीकी से दिखता है कि InnoDB बफर पूल कितना बड़ा होना चाहिए + (innodb_change_buffer_max_size में निर्दिष्ट प्रतिशत)। मुझे यकीन है कि यह अभी आपके द्वारा आरक्षित 20000M से कम होगा। रैम में बचत का उपयोग अन्य चीजों की ट्यूनिंग के लिए किया जा सकता है

सेवत # 1

यह नोट करना बहुत महत्वपूर्ण है: कई बार, InnoDB को innodb_buffer_pool_size के मूल्य पर अतिरिक्त 10% की आवश्यकता हो सकती है । यहाँ MySQL प्रलेखन इस पर क्या कहते हैं:

जितना बड़ा आप यह मान सेट करते हैं, टेबल में डेटा एक्सेस करने के लिए कम डिस्क I / O की आवश्यकता होती है। एक समर्पित डेटाबेस सर्वर पर, आप इसे मशीन भौतिक मेमोरी आकार के 80% तक सेट कर सकते हैं। यदि ये अन्य समस्याएँ होती हैं, तो इस मान को वापस लाने के लिए तैयार रहें:

भौतिक स्मृति के लिए प्रतिस्पर्धा ऑपरेटिंग सिस्टम में पेजिंग का कारण हो सकती है।

InnoDB बफ़र्स और नियंत्रण संरचनाओं के लिए अतिरिक्त मेमोरी रखता है, ताकि कुल आवंटित स्थान निर्दिष्ट आकार से लगभग 10% अधिक हो।

पता स्थान सन्निहित होना चाहिए, जो DLL के साथ विंडोज सिस्टम पर एक समस्या हो सकती है जो विशिष्ट पते पर लोड होती है।

बफर पूल को आरंभीकृत करने का समय इसके आकार के लगभग आनुपातिक है। बड़े इंस्टॉलेशन पर, यह प्रारंभिक समय महत्वपूर्ण हो सकता है। उदाहरण के लिए, एक आधुनिक लिनक्स x86_64 सर्वर पर, एक 10GB बफर पूल की शुरुआत में लगभग 6 सेकंड लगते हैं। खंड 8.9.1, " इनोबीडी बफर पूल" देखें

सेवत # २

मुझे आपके में निम्नलिखित मान दिखाई देते हैं my.cnf

| innodb_io_capacity                                | 200 |
| innodb_read_io_threads                            | 4   |
| innodb_thread_concurrency                         | 4   |
| innodb_write_io_threads                           | 4   |

ये संख्या कई कोर तक पहुँचने से InnoDB को बाधित करेगी

कृपया निम्नलिखित सेट करें:

[mysqld]
innodb_io_capacity = 2000
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
innodb_write_io_threads = 64

मैंने इसके बारे में DBA StackExchange में पहले भी लिखा है

मैं एक सर्वर में इस तरह एक सवाल का जवाब दिया अधिक संक्षिप्त सूत्र का उपयोग कर :

SELECT CONCAT(CEILING(RIBPS/POWER(1024,pw)),SUBSTR(' KMGT',pw+1,1))
Recommended_InnoDB_Buffer_Pool_Size FROM
(
    SELECT RIBPS,FLOOR(LOG(RIBPS)/LOG(1024)) pw
    FROM
    (
        SELECT SUM(data_length+index_length)*1.1*growth RIBPS
        FROM information_schema.tables AAA,
        (SELECT 1.25 growth) BBB
        WHERE ENGINE='InnoDB'
    ) AA
) A;

1
इस शानदार पोस्ट के लिए धन्यवाद! आपका सूत्र SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM...MySQL 5.7 पर निम्न त्रुटि उत्पन्न करता है: " 'INFORMATION_SCHEMA.GLOBAL_STATUS' सुविधा अक्षम है, 'show_compatibility_56' के लिए दस्तावेज़ देखें "। क्या आपके पास किसी भी संयोग से एक अद्यतन संस्करण होगा?
बेंजामिन

मुझे 307 RIBPS और 264G मिलते हैं। इसका मतलब है कि मुझे 307GB RAM चाहिए?
E_Blue

264 जी की तरह। लेकिन आपके पास इसके लिए पर्याप्त रैम होनी चाहिए, बाकी की 80% रैम का उल्लेख mysql को दें, यह निर्भर करता है कि सिस्टम पर और क्या चलता है।
sjas

2
सबसे बड़ी पोस्ट जो मैंने कभी पढ़ी है! मेरे पास 3GB के आसपास एक ~ बड़ा डेटाबेस है। आपके उत्तर / लेख और लिंक की गति को पढ़ने के बाद 2x
fat_mike

4
@Benjamin: MySQL 5.7.6 के रूप में info_schema को performance_schema में मिला दिया गया है। इसलिए इसे काम करने के लिए सिर्फ "information_schema" को क्वेरी में "performance_schema" में बदलें। स्रोत: dev.mysql.com/doc/refman/5.7/en/status-table.html
राल्फ बोल्टन

11

कुछ इस तरह? उपयोग करना SHOW VARIABLESऔर SHOW GLOBAL STATUS:

अभिव्यक्ति: innodb_buffer_pool_size / _ram
अर्थ: InnoDB बफर_पूल
अनुशंसित सीमा के लिए उपयोग की गई RAM का% : 60 ~ 80%

अभिव्यक्ति: Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
अर्थ: डिस्क को हिट करने के लिए अनुरोधों को पढ़ें
अनुशंसित सीमा: 0-2%
यदि सीमा से बाहर हो तो क्या करें: यदि आपके पास पर्याप्त है तो innodb_buffin_pool_size बढ़ाएँ राम।

अभिव्यक्ति: Innodb_pages_read / Innodb_buffer_pool_read_requests
अर्थ: डिस्क को हिट करने के लिए अनुरोधों को पढ़ें
अनुशंसित सीमा: 0-2%
अगर सीमा से बाहर हो तो क्या करें: यदि आपके पास पर्याप्त रैम है तो innodb_buffer_pool_size बढ़ाएं।

अभिव्यक्ति: Innodb_pages_written / Innodb_buffer_pool_write_requests
अर्थ: डिस्क को हिट करने के लिए अनुरोधों को लिखें
अनुशंसित रेंज: 0-15%
यदि सीमा से बाहर है तो क्या करें: Innodb_buffer_pool_size चेक

अभिव्यक्ति: Innodb_buffer_pool_reads / Uptime
अर्थ: पुस्तकें
अनुशंसित सीमा: 0-100 / सेक।
यदि सीमा से बाहर है तो क्या करें: innodb_buffer_pool_size बढ़ाएँ

अभिव्यक्ति: (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
अर्थ: InnoDB I / O
अनुशंसित सीमा: 0-100 / सेकंड।
यदि सीमा से बाहर है तो क्या करें: innodb_buffer_pool_size बढ़ाएँ

अभिव्यक्ति: Innodb_buffer_pool_pages_flushed / Uptime
अर्थ: लिखता है (फ्लश)
अनुशंसित सीमा: 0-100 / सेकंड।
यदि सीमा से बाहर है तो क्या करें: innodb_buffer_pool_size बढ़ाएँ

अभिव्यक्ति: Innodb_buffer_pool_wait_free / Uptime
अर्थ: जब बफर_पुल में कोई मुफ्त पृष्ठ नहीं हैं तो काउंटर करें। यानी सभी पेज गंदे हैं।
अनुशंसित सीमा: 0-1 / सेकंड।
सीमा से बाहर होने पर क्या करें: पहले सुनिश्चित करें कि innodb_buffer_pool_size यथोचित रूप से सेट है; यदि अभी भी परेशानी है, तो innodb_max_dirty_pages_pct को कम करें


धन्यवाद @ अच्छी टिप्पणी के लिए क्लिक करें। क्या innodb_buffer_pool_sizeमूल्य निर्दिष्ट करता है? वास्तविक आकार या एक कॉन्फ़िगर किया गया?
जोकर

1
@ जोकर - innodb_buffer_pool_sizeअधिकतम आकार को इंगित करता है। एक विशिष्ट सर्वर में, "बफर पूल" छोटा शुरू होता है, लेकिन जल्दी से उस अधिकतम आकार में बढ़ता है और वहां रहता है। नोट: यदि वह रैम (या उससे भी करीब) से बड़ा है, तो वह स्वैपिंग की ओर जाता है, जो प्रदर्शन के लिए भयानक है।
रिक जेम्स

7

आपका शीर्षक innodb_buffer_pool_size के बारे में पूछता है, लेकिन मुझे संदेह है कि वास्तविक समस्या नहीं है। (रोलांडो ने टिप्पणी की कि आपने इसे बहुत बड़ा क्यों बनाया है, यहां तक ​​कि बहुत बड़ा भी।)

मैंने अधिकतम कनेक्शन = 800 निर्धारित किए हैं जो कभी-कभी संतृप्त होते हैं और सर्वर को रोकते हैं।

यह स्पष्ट नहीं है। "स्लीप" मोड में 800 उपयोगकर्ता सिस्टम पर लगभग शून्य प्रभाव डालते हैं। 800 सक्रिय धागे एक आपदा होगी। कितने धागे "चल" रहे हैं?

क्या धागे एक-दूसरे को अवरुद्ध कर रहे हैं? गतिरोध आदि के कुछ सुरागों के लिए SHOW Engine INNODB STATUS देखें।

क्या कोई प्रश्न मंदी में दिखाई दे रहा है? चलो उनका अनुकूलन करते हैं।

आप कौन सा संस्करण उपयोग कर रहे हैं? XtraDB (InnoDB के लिए एक ड्रॉप-इन प्रतिस्थापन) कई कोर का उपयोग करने का एक बेहतर काम करता है। 5.6.7 और भी बेहतर काम करता है।

innodb_buffer_pool_instances - इसे 8 में बदलें (20G बफर_पुल मानकर); यह म्यूटेक्स विवाद पर थोड़ा कटौती करेगा।

क्या आप I / O बाध्य हैं या आप CPU बाध्य हैं? आपके उत्तर के आधार पर समाधान मौलिक रूप से भिन्न हैं।

SSD - यह बेहतर हो सकता है कि सभी लॉग फाइलें नॉन-एसएसडी ड्राइव पर हों।


6

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

सक्रिय पृष्ठों के लिए आपके द्वारा निर्दिष्ट समय सीमा प्रदर्शन को प्रभावित करती है, लेकिन एक इष्टतम बिंदु है, जहां आपको बड़े बफर आकार के लिए अधिक प्रदर्शन नहीं मिलेगा। आप अनुमान लगा सकते हैं / गणना / माप कि द्वाराshow engine innodb status

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