it-swarm.asia

ما هو الحجم الذي يجب أن يكون mysql innodb_buffer_pool_size؟

لدي قاعدة بيانات مزدحمة بجداول InnoDB فقط والتي يبلغ حجمها حوالي 5 جيجابايت. تعمل قاعدة البيانات على خادم دبيان باستخدام أقراص SSD وقمت بتعيين اتصالات قصوى = 800 والتي أحيانًا تشبع الخادم وتوقفه عن العمل. متوسط ​​الاستعلام في الثانية حوالي 2.5 كيلو. لذلك أحتاج إلى تحسين استخدام الذاكرة لإفساح المجال لأقصى قدر ممكن من الاتصالات.

لقد رأيت اقتراحات بأن 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 الحالية:

| 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                                                                                                                      |

ملاحظة جانبية قد تكون ذات صلة: أرى أنه عندما أحاول إدراج مشاركة كبيرة (لنقل أكثر من 10 كيلوبايت) من Drupal (الموجود على خادم ويب منفصل) إلى قاعدة البيانات ، فإنه يستمر إلى الأبد والصفحة لا تعود بشكل صحيح.

فيما يتعلق بهذه ، أتساءل ما يجب أن يكون حجم innodb_buffer_pool_size لأداء أمثل. أنا أقدر اقتراحاتك لتعيين هذه المعلمات وغيرها على النحو الأمثل لهذا السيناريو.

186
alfish

innodb_buffer_pool_size هائلة. قمت بتعيينه في 20971520000. هذا هو 19.5135 غيغابايت. إذا كان لديك 5 غيغابايت فقط من بيانات وفهارس InnoDB ، فيجب أن يكون لديك حوالي 8 غيغابايت فقط. حتى هذا قد يكون مرتفعًا جدًا.

هنا هو ما يجب عليك القيام به. قم أولاً بتشغيل هذا الاستعلام

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 ، حجم حوض التخزين المؤقت الموصى به من InnoDB ، استنادًا إلى جميع بيانات ومؤشرات InnoDB ، بنسبة 60٪ إضافية.

فمثلا

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 Data في InnoDB Buffer Pool في هذه اللحظة.

لقد كتبت عن هذا من قبل: ماذا تحدد innodb_buffer_pool ولماذا ..؟

يمكنك تشغيل هذا الاستعلام DataGB الآن بدلاً من إعادة التكوين وإعادة التشغيل والانتظار لمدة أسبوع.

تشبه هذه القيمة DataGB بشكل أوثق حجم تجمع InnoDB Buffer Pool الذي يجب أن يكون + (النسبة المئوية المحددة في innodb_change_buffer_max_size). أنا متأكد من أن هذا سيكون أقل بكثير من 20000M التي حجزتها الآن. يمكن استخدام المدخرات في RAM لضبط أشياء أخرى مثل

كافيت # 1

من المهم جدًا ملاحظة ذلك: في بعض الأحيان ، قد يتطلب InnoDB زيادة بنسبة 10٪ إضافية عن القيمة innodb_buffer_pool_size . إليك ما يقوله توثيق MySQL في هذا:

كلما كبرت هذه القيمة ، قلت الحاجة إلى إدخال/إخراج للقرص للوصول إلى البيانات في الجداول. على خادم قاعدة بيانات مخصص ، يمكنك تعيين هذا حتى 80٪ من حجم الذاكرة الفعلية للجهاز. كن مستعدًا لتقليص هذه القيمة في حالة حدوث هذه المشكلات الأخرى:

قد يتسبب التنافس على الذاكرة الفعلية في الترحيل في نظام التشغيل.

يحتفظ InnoDB بذاكرة إضافية للمخازن المؤقتة وهياكل التحكم ، بحيث يكون إجمالي المساحة المخصصة أكبر بنسبة 10٪ تقريبًا من الحجم المحدد.

يجب أن تكون مساحة العنوان متجاورة ، مما قد يمثل مشكلة في أنظمة Windows مع DLLs التي يتم تحميلها في عناوين محددة.

يتناسب وقت تهيئة تجمع المخزن المؤقت مع حجمه تقريبًا. في عمليات التثبيت الكبيرة ، قد يكون وقت التهيئة هذا مهمًا. على سبيل المثال ، على خادم Linux x86_64 حديث ، تستغرق تهيئة تجمع 10 جيجا بايت حوالي 6 ثوانٍ. راجع القسم 8.9.1 ، "The InnoDB Buffer Pool" .

كافيت # 2

أرى القيم التالية في 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

لقد أجبت للتو على سؤال مثل هذا في Server Fault باستخدام صيغة أكثر إيجازًا:

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;
273
RolandoMySQLDBA

شيء من هذا القبيل؟ باستخدام SHOW VARIABLES و SHOW GLOBAL STATUS:

التعبير: innodb_buffer_pool_size / _ram
المعنى: ٪ من RAM مستخدمة لـ innoDB buffer_pool
النطاق الموصى به: 60 ~ 80٪

التعبير: Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
المعنى: قراءة الطلبات التي يجب أن تضرب القرص
النطاق الموصى به: 0-2٪
ماذا تفعل إذا كانت خارج النطاق: قم بزيادة innodb_buffer_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
المعنى: عداد عندما لا توجد صفحات مجانية في buffer_pool. أي أن كل الصفحات متسخة.
النطاق الموصى به: 0-1/ثانية.
ماذا تفعل إذا كانت خارج النطاق: تأكد أولاً من تعيين innodb_buffer_pool_size بشكل معقول ؛ إذا استمرت المشكلة ، قلل innodb_max_dirty_pages_pct

13
Rick James

يسأل عنوانك عن innodb_buffer_pool_size ، لكني أشك في أن هذه ليست المشكلة الحقيقية. (علق Rolando على سبب تعيينه كبيرًا بما يكفي ، حتى كبير جدًا.)

لقد قمت بتعيين الحد الأقصى من الاتصالات = 800 والذي يشبع أحيانًا ويطحن الخادم للتوقف.

هذا غير واضح. 800 مستخدم في وضع "السكون" ليس له أي تأثير تقريبًا على النظام. 800 خيط نشط سيكون كارثة. كم عدد الخيوط "قيد التشغيل"؟

هل الخيوط تحجب بعضها البعض؟ انظر حالة SHOW ENGINE INNODB للحصول على بعض القرائن بشأن الجمود ، إلخ.

هل تظهر أي استفسارات في قائمة بطيئة؟ دعونا تحسينها.

ما هو إصدار الذي تستخدمه؟ XtraDB (بديل بديل لـ InnoDB) يقوم بعمل أفضل باستخدام نوى متعددة. 5.6.7 يقوم بعمل أفضل.

innodb_buffer_pool_instance - قم بتغيير هذا إلى 8 (بافتراض وجود مخزن مؤقت 20G) ؛ فإنه سيقلص قليلاً من الخلاف Mutex.

هل أنت مُدخل/منفذ أو وحدة المعالجة المركزية مُلزمة؟ تختلف الحلول جذريًا ، اعتمادًا على إجابتك.

SSD - قد يكون من الأفضل إذا كانت جميع ملفات السجل على محركات أقراص غير SSD.

7
Rick James

المزيد من الذاكرة دائمًا أفضل ، ولكن في تجربتي في معظم الأوقات ، يجب ألا يتناسب حجم تجمع المخزن المؤقت مع حجم البيانات. العديد من الجداول غير نشطة في معظم الأوقات ، مثل جداول النسخ الاحتياطي التي تقع حولها ، لذا يجب أن يناسبك حجم تجمع المخزن المؤقت innodb حجم البيانات النشطة.

يؤثر الإطار الزمني الذي تحدده للصفحات النشطة على الأداء ، ولكن هناك نقطة مثالية ، حيث لن تحصل على المزيد من الأداء لحجم أكبر للمخزن المؤقت. يمكنك تقدير/حساب/قياس ذلك بواسطة show engine innodb status

6
user77376