Оптимальна кількість екземплярів буфера пулу MySQL InnoDB


13

Характеристики сервера

  • Загальна системна оперативна пам’ять: 8 Гб (на ній працює MySQL + інші речі, крім MySQL, тобто не присвячені MySQL)
  • Кількість ядер процесора: 6
  • У мене є дані в db на суму близько 2 Гб
  • У мене розмір буфера для InnoDB розміром 4 Гб

Що краще:

  • Примірники буферного басейну Innodb встановлені на 1?
  • Вимір басейну Innodb встановлений на 2 (2 ГБ у кожному)?
  • Примірники буферного басейну Innodb встановлені на 4 (по 1 ГБ у кожному)?
  • Примірники буферного басейну Innodb встановлені на 8 (налаштування за замовчуванням)

Таким чином, я не впевнений у тому, як міркувати, коли мова заходить про екземпляри буферного пулу, а також про все "використання екземплярів або перенесення змін в ОС, коли такий великий розмір пулу InnoDB".


Звідки ви взяли "використовувати екземпляри або зазнаєте змін у ОС під час такого великого розміру пулу InnoDB"?
Рік Джеймс

70% оперативної пам’яті для всього buffer_pool після віднімання місця для «інших речей, ніж MySQL» має бути нормальним, незалежно від кількості примірників.
Рік Джеймс

Я не можу встановити жодних прийнятих відповідей, оскільки вважаю, що вони "стріляють з стегна". Якщо хтось задається питанням, я пішов з розміром буфера 4G та двома примірниками, і він дуже добре працює на Debian 8.1 з 8G загальної пам’яті, що працює на php-fpm + nginx на одній і тій же машині з приблизно mysql, що працює в середньому 60 запитів / секунду.
Adergaard

Відповіді:


7

Коли я повернусь до MySQL 5.5, я б подумав про те саме.

Що я дізнався за ці роки, було наступне: Якщо буферний пул був більшим за половину встановленої оперативної пам’яті, а innodb_buffer_pool_instance був 1 (за замовчуванням для 5,5), загроза заміни завжди була неминучою.

Я обговорював це раніше: чи існує правило щодо розміру та кількості екземплярів буферного пулу? . У цій публікації я згадав приклад клієнта, який на сервері мав 192 ГБ оперативної пам’яті з буферним пулом 162 ГБ. Коли innodb_buffer_pool_in вещества було 1, відбувся замін . Коли я встановив innodb_buffer_pool_instance на 2, все стало краще.

У вашому випадку, оскільки буферний басейн рівно наполовину, значення 1 може бути нормальним. Я б не випадково. Я встановив би це на 2.

Оскільки у MySQL 5.6 за замовчуванням 8, вам більше не слід думати про це.

Скажу так: відповідь акумунського має найвищий принцип . Моя відповідь - це просто стрілянина з стегна на основі минулого досвіду (хорошого та поганого).


У жодному разі! Заміна залежить від обсягу виділеної пам'яті, а не від примірників пулу.
Рік Джеймс

Добре знати, що за замовчуванням дорівнює 8 ... Але яка різниця, якщо вона була скорочена до 4 або збільшена до 16? Чи є певна пам'ять / пені за зберігання чи користь? Єдина причина, по якій я справді тут, mysqltuner рекомендує innodb_buffer_pool_instance (= 1), але я не завжди довіряю її рекомендаціям. Зрозуміло, у мене немає проблем, просто цікаво.
PJ Brunet

@PJBrunet, якщо пул буфера InnoDB становить менше половини оперативної пам’яті, то екземпляри пулу InnoDB можна залишити на 1.
RolandoMySQLDBA

6

Кількість екземплярів буферного пулу слід збільшити, щоб уникнути суперечок мутексу пулу буфера.

З розміром буферного пулу 8 ГБ, я сумніваюся, ви коли-небудь побачите вміст мутексного буфера пулу.

ОНОВЛЕННЯ 0 :

Я згадую 8Gb буферний пул у відповіді, тоді як в оригінальному питанні загальна пам'ять становила 8 Гб. Звичайно, буферний пул повинен бути менше 8 Гб. 4 Гб звучить як гарний старт, але переконайтесь, що не відбувається жодної заміни

ОНОВЛЕННЯ 1 :

// з слайдів Yasufumi (в останніх версіях 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

Якщо ви бачите велику кількість очікувань мютексу пулу буфера, то саме час розглянути декілька екземплярів буферного пулу. Суперечка навряд чи відбудеться в буферному пулі менше ~ 48G.


1
Але у вас немає 8G buffer_pool лише у 8 Гб оперативної пам’яті!
Рік Джеймс

При якому розмірі dbsize, тобто розмірі буфера innodb , ви б почали думати про екземпляри? Я тлумачу Вашу відповідь тим, що на цих відносно невеликих рівнях немає причин мати більше одного. Правильно? У вас є джерело про це так? У документації на MySQL написано "багато гігабайт", що - для мене - дуже нечіткий спосіб вираження речей. Насправді 2 Гбайт є мульти, але я думаю, що вони посилаються на більший набір даних, ніж цей ...
Adergaard

2

Встановіть "swappiness" на 1, якщо ваша ОС має таке. Проблема може бути надмірно агресивним OOM.


0

Я б запропонував встановити це так, щоб відповідати максимальній кількості потоків MySQL, які ви хочете одночасно запустити. Я використовую кількість ядер.

Я також встановив innodb_read_io_threadsі innodb_write_io_threadsвідповідати цьому номеру.

Якщо innodb_buffer_pool_instancesвона занадто низька, ваші нитки, ймовірно, застрягнуть в очікуванні семафору. Це робить і процесор, і введення / виведення непрацюючими, навіть якщо система повинна бути зайнята - і затримка вашої програми пройде через дах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.