Максимальне використання пам'яті MySQL


111

Хотілося б знати, як можна встановити верхню межу обсягу пам’яті, яку MySQL використовує на сервері Linux.

Зараз MySQL буде зберігати пам'ять з кожним новим запитом, щоб в кінцевому рахунку не вистачало пам'яті. Чи можна встановити ліміт, щоб MySQL використовував не більше цієї суми?


4
MySQL не "займає пам'ять для кожного нового запиту і з часом закінчується". Використання пам'яті набагато складніше за це.
Рік Джеймс

Відповіді:


183

Максимальне використання пам'яті MySQL дуже залежить від обладнання, налаштувань та самої бази даних.

Апаратне обладнання

Обладнання є очевидною частиною. Чим більше оперативної пам'яті, тим швидше диски ftw . Не вірте тим щомісячним чи тижневим новинним листам. MySQL не масштабується лінійно - навіть на апаратному забезпеченні Oracle. Це трохи хитріше за це.

Суть полягає в тому : немає Загального правила для того , що рекомендую для вашої установки MySQL. Все залежить від поточного використання або прогнозів.

Налаштування та база даних

MySQL пропонує незліченну кількість змінних і комутаторів для оптимізації його поведінки. Якщо у вас виникли проблеми, вам дійсно потрібно сісти і прочитати посібник (f'ing).

Щодо бази даних - кілька важливих обмежень:

  • стіл двигун ( InnoDB, MyISAM, ...)
  • розмір
  • індекси
  • використання

Більшість порад MySQL щодо stackoverflow розповість про 5-8 так званих важливих налаштувань. По-перше, не всі вони мають значення - наприклад, виділяти багато ресурсів InnoDB та не використовувати InnoDB не має великого сенсу, оскільки ці ресурси витрачаються даремно.

Або - багато людей пропонують збільшити max_connectionзмінну - ну, мало хто їх знає, це також означає, що MySQL виділить більше ресурсів для задоволення цих потреб, max_connections- якщо це буде потрібно. Більш очевидним рішенням може бути закриття підключення до бази даних у вашому DBAL або зменшення wait_timeoutдля звільнення цих потоків.

Якщо ви спіймаєте мій дрейф - насправді багато, багато чого читати і вчитися.

Двигуни

Настільні двигуни є досить важливим рішенням, багато людей забувають про тих, хто на ранніх стадіях, а потім раптом опиняються в боротьбі зі MyISAMстолом розміром 30 ГБ, який замикає і блокує їхнє все застосування.

Я не хочу сказати, що MyISAM відстійний , але InnoDBйого можна налаштувати, щоб реагувати майже або майже так само швидко, MyISAMі пропонує таке, як блокування рядків, UPDATEтоді як MyISAMблокує всю таблицю, коли вона написана.

Якщо ви можете вільно запускати MySQL на власній інфраструктурі, ви також можете перевірити сервер percona, оскільки серед багатьох внесків компаній, таких як Facebook та Google (вони знають швидко), він також включає власну програму Percona в заміну на InnoDB, наз XtraDB.

Перегляньте мою суть щодо налаштування percona-сервера (та -client) (на Ubuntu): http://gist.github.com/637669

Розмір

Розмір бази даних дуже-дуже важливий - вірите чи ні, більшість людей на Intarwebs ніколи не обробляють великі і пишуть інтенсивні установки MySQL, але такі дійсно існують. Деякі люди тролять і скажуть щось на кшталт "Використовуйте PostgreSQL !!! 111", але давайте ігноруємо їх поки.

Суть полягає в тому, що: залежно від розміру, рішення про обладнання повинно прийматися. Насправді не можна змусити базу даних 80 Гб швидко працювати на 1 ГБ оперативної пам’яті.

Індекси

Це не так: тим більше, тим веселіше. Потрібно встановити лише необхідні індекси та перевірити їх використання EXPLAIN. Додайте до цього, що MySQL EXPLAINдійсно обмежений, але це початок.

Пропоновані конфігурації

Про ці my-large.cnfта my-medium.cnfфайли - я навіть не знаю, для кого вони були написані. Згорніть своє.

Налаштування грунтовки

Чудовий початок - тюнінг-грунтовка . Це bash-скрипт (підказка: вам знадобиться linux), який приймає висновок SHOW VARIABLESта SHOW STATUSперетворює його на сподівання корисну рекомендацію. Якщо ваш сервер працює деякий час, рекомендація буде кращою, оскільки будуть дані, на яких вони будуть базуватися.

Тюнінг-праймер - це не чарівний соус. Ви все ще повинні прочитати всі змінні, які він пропонує змінити.

Читання

Мені дуже подобається рекомендувати mysqlperformanceblog . Це чудовий ресурс для всіх видів порад, пов’язаних з MySQL. І це не лише MySQL, вони також багато знають про правильне обладнання або рекомендують налаштування для AWS тощо. Ці хлопці мають роки та багаторічний досвід.

Ще один чудовий ресурс - це планета-mysql , звичайно.


Я не знаю про tuning primerте, як це порівняти mysqltuner?
greg0ire

38

Ми використовуємо ці налаштування:

etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100

для сервера з такими специфікаціями:

Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA

16
Я думаю, що ви (і автор, з яким ви посилаєтесь) маєте query_cache_size та query_cache_limit неправильно. Ви говорите MySQL: виділіть кеш-пам'ять 1 Мб, але не вкладайте в нього запитів, що перевищують 128 Мб. dev.mysql.com/doc/refman/5.0/uk/query-cache-configuration.html
agtb

Я б знизив max_connections. Я б вирішив, який двигун використовувати, а не виділяти багато місця для обох.
Рік Джеймс

19

Використання пам'яті бази даних - це складна тема. Блог продуктивності MySQL робить хорошу роботу покриття на ваше запитання, і списки багато причин , чому це дуже непрактично пам'яті «резерв».

Якщо ви дійсно хочете накласти жорсткий ліміт, ви можете це зробити, але вам доведеться це робити на рівні ОС, оскільки немає вбудованої настройки. У Linux ви можете використовувати ulimit , але вам, ймовірно, доведеться змінити спосіб запуску MySQL, щоб нав'язати це.


Найкраще рішення - налаштувати ваш сервер, щоб поєднання звичних налаштувань пам’яті MySQL призвело до загального зниження обсягу пам’яті вашою установкою MySQL. Це, звичайно, негативно вплине на продуктивність вашої бази даних, але деякі з налаштувань, які ви можете змінити, my.iniце:

key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size

Я б почав там і побачив, чи зможете ви отримати потрібні результати. Існує багато статей про коригування налаштувань пам'яті MySQL.


Редагувати:

Зауважте, що деякі нові імена змінних змінилися у новіших версіях 5.1.x MySQL .

Наприклад:

table_cache

Зараз:

table_open_cache

2
Привіт! Дякую за вашу відповідь. Я помітив, що рівняння, яке цитують люди, таке: key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = Загальна пам'ять. Я встановив наступне: key_buffer_size = 128M, read_buffer_size = 1M, sort_buffer_size = 2M, max_connections = 120, а загальна пам'ять на сервері - 512М. Однак після багатьох запитів вільна пам'ять знизилася до 12 М і, ймовірно, продовжуватиме зменшуватись при подальшому використанні. Чи є причина, чому це так, і чи можна це запобігти? Дякую!

А може мені потрібно врахувати не загальну пам'ять на сервері (512М), а вільну пам'ять (тобто пам'ять, доступну після завантаження всіх пов'язаних з ОС та інших програм)?

1
Якщо ви збираєтесь змінити tmp_table_size з наміром збільшити розмір темп-таблиць, які можна зберігати в оперативній пам’яті, пам’ятайте, що також збільшите max_heap_table_size - оскільки MySQL використовує мінімум з двох ...
Дейв Рікс

1
@TimothyMilsud - Така формула не працює. І більшість серверів працює досить добре, коли формула вимагає занадто багато оперативної пам'яті.
Рік Джеймс

19

mysqld.exe використовував 480 Мб в оперативній пам'яті. Я виявив, що додав цей параметр до my.ini

table_definition_cache = 400

що зменшило використання пам'яті з 400 000+ кб до 105 000 кб


У якому розділі йдеться про це? Я додав його до свого, і сервіс відмовився запускати.
Синтаксична помилка

Не маючи на увазі, я перемістив його під [wampmysqld], і він спрацював чудово і зменшив об'єм пам'яті, яку я використовував. Я думаю, що це, можливо, прискорило і завантаження моїх локальних хостів у процесі, і зараз вони здаються швидшими.
Синтаксична помилка

Хоча за замовчуванням і мінімум дорівнює 400, що призвело до того, що у вашому випадку це було вище 400?
Wadih M.

5

в /etc/my.cnf:

[mysqld]
...

performance_schema = 0

table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000

query_cache_size = 0
query_cache_limit = 0

...

Гарна робота на сервері з 256 МБ пам'яті.


Чому дорівнює table_definition_cache= 0? Деякі пояснення було б добре. І ви в основному не кешуєте запити ... такий же ефект, якщо ви query_cache_type = 0:)
Khom Nazid

0

Якщо ви шукаєте оптимізувати ваш контейнер docker mysql, команда нижче може допомогти. Мені вдалося запустити контейнер докера mysql від замовчування від 480 Мб до всього 100 Мбіт

docker run -d -p 3306: 3306 -e MYSQL_DATABASE = тест -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = тест -e MYSQL_PASSWORD = тест -v / mysql: / var / lib / mysql - ім'я mysqldb mysql --table_definition_ca --performance_schema = 0 - default-authentication-plugin = mysql_native_password

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