Найкращі параметри кешу MySQL для 8Gb оперативної пам’яті, призначеного для MySQL-сервера, використовуючи лише InnoDB (5 Гб бази даних)


20

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

Я намагався зробити все просто, використовуючи лише InnoDB як двигун зберігання даних. І у мене є виділений сервер для MySQL. Він має 8 Гб оперативної пам’яті, як я повинен виділяти це для досягнення максимальної продуктивності? Я хотів би мати можливість помістити всю свою базу даних в пам'ять для найкращого виконання. База даних становить близько 5 Гб. Чи можливо це?

Скільки пам'яті потрібно виділити в кеш запитів? Скільки коштує буферний пул InnoDB? Скільки коштує решта комп'ютера (тобто не пов'язані з MySQL процеси)? І т.д.

Оскільки я не використовую MyISAM, мені не потрібно вводити багато пам'яті в кеш-пам'ять правильно?

Відповіді:


25

Це важко, не знаючи багато про саму базу даних. Є кілька інструментів, про які слід пам’ятати;

Про збереження всієї бази даних у пам'яті; Будь-які запити, що вносять зміни до бази даних, залишатимуться відкритими, поки запис не буде виконано на диску. Єдине, що може уникнути того, що диск стане вузьким місцем, - це дисковий контролер з кешем запису.

Я б розпочав із наступних змін із значень за замовчуванням:

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

Тоді я побачив би, як все йде, і спробував би різні речі на основі (серед іншого) результатів згаданих вище інструментів. Я б також переконався в графіці тенденцій за допомогою інструменту моніторингу, такого як Мунін або Кактуси , щоб побачити, з яким навантаженням я справді маю справу. Особисто я маю великий досвід роботи з плагінами MySQL, наданими Муніним.


Дякую, я спробую це зробити і побачу, чи зможу я дізнатися щось нове.
billmalarky

@billmalarky Ласкаво просимо до сервера! :) Не забудьте підтвердити або позначити питання правильним, якщо ви задоволені отриманою відповіддю.
Kvisle

+1 за рекомендацію mysqltuner.pl !!!
RolandoMySQLDBA

@Kvisle Дякую за привіт! Я деякий час був навколо stackoverflow (ну ... кілька місяців це ...), але я новачок у сервері за замовчуванням. Я фактично розміщуюсь з voxel.net та їх проманедженим хостингом (підтримка системи IE) - це справді чудово, але я подумав, що було б доречно шукати зовнішній вигляд, тому я не звучав як повний інструмент, коли розмовляв з ними про це.
billmalarky

1
@Kvisle Також я зазначу правильну відповідь, але я хочу, щоб це трохи тушкувалося, щоб отримати гарний мозковий штурм.
billmalarky

9

ІМХО, з яким ви повинні мати можливість піти

innodb_buffer_pool_size=5G

Це було б 62,5% оперативної пам’яті при достатньому обсязі оперативної пам’яті для операційної системи Server плюс пам’яті для з'єднань з БД

@kvisle рекомендує використовувати mysqltuner.pl. Цей сценарій відмінно підходить для судження кількості оперативної пам’яті, що виділяється на join_buffer_size, sort_buffer_size, read_buffer_size та read_rnd_buffer_size. Ці 4 буфери, додані разом, множать на max_connections. Ця відповідь додається до статичних буферів (innodb_buffer_pool_size + key_buffer_size). Повідомляються про сукупні суми. Якщо сумарна сума перевищує 80% оперативної пам’яті, тоді ви повинні зменшити розміри буфера. mysqltuner.pl буде дуже корисний у цьому плані.

Оскільки всі ваші дані є InnoDB, ви можете зробити key_buffer_size (буфер кешу ключів для індексів MyISAM) дуже низьким (я рекомендую 64М).

Ось публікація, яку я зробив у DBA StackExchange, щоб обчислити рекомендований розмір innodb_buffer_pool_size .

ОНОВЛЕННЯ 2011-10-15 19:55 EDT

Якщо ви знаєте, що у вас буде 5 Гб даних, тоді моя перша рекомендація була в порядку. Однак я забув додати одне:

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

Розмір файлу журналу повинен бути 25% від пулу InnoDB

ОНОВЛЕННЯ 2011-10-16 13:36 EDT

Правило 25% ґрунтується виключно на використанні двох журнальних файлів. Хоча можна використовувати кілька файлів журналу innodb, два найкраще працюють найкраще.

Інші висловились, використовуючи 25%

Однак, чесно кажучи, хтось із оригінальної компанії InnoBase Oy висловився, що не використовує правило 25% через наявність більшого пулу буферів InnoDB .

Звичайно, правило 25% не може працювати, коли у вас є величезна кількість оперативної пам’яті. Фактично, найбільший innodb_log_file_size, дозволений із використанням лише 2-х файлів журналу, - 2047M, оскільки комбінований розмір файлу журналу повинен бути меншим 4G (4096M)

СЛУЧАЙ В ТОЧКІ: Один із клієнтів мого роботодавця має сервер БД із 192 ГБ оперативної пам'яті. Немає можливості мати файли журналів 48G. Я просто використовую максимальний розмір файлу для файлу журналу innodb, 2047M. @ Коментар Kvisle на мою відповідь просто дає посилання, вказуючи, що вам не потрібно обмежуватись двома файлами журналу. Якщо у вас N файлів журналів, вони не можуть набирати 4G. Моє правило 25% знаходиться просто в ідеальному світі (сервер DB з 8 Гб або менше).


Дякую, я обов'язково буду використовувати mysqltuner.pl. Однак я повинен запитати, чи буде цей сценарій все-таки точним, якщо моя база даних зараз порожня? У мене всі таблиці та схеми налаштовані правильно, але фактичних даних немає. Я використав 5gb в якості прикладу розміру, який я б використовував на моєму поточному виділеному сервері (тобто, як тільки БД отримає більше, ніж цей, я, ймовірно, перейду на краще виділений сервер). В даний час база даних порожня (це абсолютно новий сайт, який не запустився), але я хочу налаштувати mysql, щоб добре обробляти масштаб перед попереднім запуском.
billmalarky

Оновлено мою відповідь !!!
RolandoMySQLDBA

Я хочу прокоментувати "Повинно бути 25% буферного басейну InnoDB". Тому що це не на 100% правда. Прочитайте dev.mysql.com/doc/refman/5.0/en/…, щоб отримати більш детальну відповідь. Ефективність, це дуже допомагає трохи збільшити розмір за замовчуванням, але вам не доведеться збільшувати його.
Kvisle

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