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

111

Я хотел бы знать, как можно установить верхний предел объема памяти, используемой MySQL на сервере Linux.

Прямо сейчас MySQL будет занимать память с каждым новым запросом, так что в конечном итоге у него заканчивается память. Есть ли способ установить лимит, чтобы MySQL не использовал больше этой суммы?

shilovk
источник
4
MySQL не «занимает память для каждого нового запроса и в конечном итоге заканчивается». Использование памяти намного сложнее.
Rick James

Ответы:

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 (они знают быстро), он также включает собственный Drop- в замен InnoDB, называется XtraDB.

См. Мою суть для настройки percona-server (и -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 и т. Д. У этих ребят многолетний опыт.

Еще один отличный ресурс - это , конечно же, planet-mysql .

Пока
источник
Я не знаю tuning primer, как это по сравнению с mysqltuner?
greg0ire 01
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/en/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 = Total Memory. Я установил следующее: key_buffer_size = 128M, read_buffer_size = 1M, sort_buffer_size = 2M, max_connections = 120, а общая память на сервере составляет 512M. Однако после множества запросов объем свободной памяти упал до 12 МБ и, вероятно, продолжит уменьшаться при дальнейшем использовании. Есть ли причина, по которой это так, и можно ли это предотвратить? Спасибо!
Или, может быть, мне нужно учитывать не общую память на сервере (512 МБ), а свободную память (т.е. память, доступную после загрузки всех связанных с ОС и других программ)?
1
Если вы собираетесь изменить tmp_table_size с целью увеличения размера временных таблиц, которые могут храниться в ОЗУ, не забудьте также увеличить max_heap_table_size - поскольку MySQL использует минимум два ...
Дэйв Рикс,
1
@TimothyMilsud - Никакая такая формула не работает. И большинство серверов работают нормально, когда формула утверждает, что используется слишком много оперативной памяти.
Rick James
19

mysqld.exe использовал 480 МБ ОЗУ. Я обнаружил, что добавил этот параметр в my.ini

table_definition_cache = 400

что уменьшило использование памяти с 400 000+ кбайт до 105 000 кбайт

Сарвар Нишонбоев
источник
В какой раздел это входит? Я добавил его в свой, и служба отказалась запускаться.
Синтаксическая ошибка
Неважно, я переместил его в [wampmysqld], и он отлично работал и значительно уменьшил объем памяти, который я использовал. Я думаю, что это могло ускорить загрузку моих страниц localhost в процессе, теперь они кажутся быстрее.
Синтаксическая ошибка
Хотя по умолчанию и минимум - 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 МБ.

shilovk
источник
Почему table_definition_cache= 0? Некоторое объяснение было бы неплохо. И вы в основном не кешируете запросы ... тот же эффект, если вы query_cache_type = 0:)
Хом Назид 01
0

Если вы ищете оптимизацию своего контейнера docker mysql, вам может помочь следующая команда. Мне удалось запустить контейнер докеров mysql с 480 МБ по умолчанию до 100 МБ

docker run -d -p 3306: 3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql: / var / lib / mysql --name mysqldb mysql --table_definition_cache = 100 --performance_schema = 0 --default-authentication-plugin = mysql_native_password

Рохит Салеха
источник