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

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

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

7 ответов

Максимальное использование памяти MySQL во многом зависит от аппаратного обеспечения, ваших настроек и самой базы данных.

аппаратные средства

Аппаратное обеспечение является очевидной частью. Чем больше RAM, тем лучше, быстрее диски ftw. Не верьте тем ежемесячным или еженедельным новостным письмам. MySQL не масштабируется линейно - даже на оборудовании Oracle. Это немного сложнее, чем это.

Суть в том, что не существует общего эмпирического правила для того, что рекомендуется для вашей установки MySQL. Все зависит от текущего использования или прогнозов.

Настройки и база данных

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

Что касается базы данных - несколько важных ограничений:

  • настольный двигатель (InnoDB, MyISAM...)
  • размер
  • индексы
  • использование

Большинство советов MySQL по stackru расскажет вам о 5-8 так называемых важных настройках. Во-первых, не все из них имеют значение - например, выделение большого количества ресурсов для InnoDB и отказ от использования InnoDB не имеет большого смысла, потому что эти ресурсы тратятся впустую.

Или - многие люди предлагают max_connection переменная - ну, мало ли они знают, это также подразумевает, что MySQL будет выделять больше ресурсов для удовлетворения этих max_connections - если понадобится Более очевидное решение может заключаться в том, чтобы закрыть соединение с базой данных в вашей DBAL или уменьшить wait_timeout чтобы освободить эти темы.

Если вы поймете мой дрейф - там действительно много, много чего можно почитать и узнать.

Двигатели

Настольные движки - довольно важное решение, многие забывают о них рано, а потом вдруг начинают бороться с размером 30 ГБ. MyISAM таблица, которая блокирует и блокирует все приложение.

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

Если вы можете запускать MySQL в своей собственной инфраструктуре, вы также можете попробовать сервер Percona, потому что среди множества предложений от таких компаний, как Facebook и Google (они знают это быстро), он также включает в себя собственный перкон. в замен 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 и оборачивает это в, мы надеемся, полезную рекомендацию. Если ваш сервер работал некоторое время, рекомендация будет лучше, так как будут данные, на которых они будут основаны.

Тюнинг-праймер - это не волшебный соус. Вы все еще должны прочитать все переменные, которые он предлагает изменить.

чтение

Мне очень нравится рекомендовать http://www.mysqlperformanceblog.com/. Это отличный ресурс для всевозможных советов, связанных с MySQL. И это не только MySQL, они также много знают о правильном оборудовании или рекомендуют настройки для AWS и т. Д. Эти парни имеют многолетний опыт работы.

Еще один замечательный ресурс - планета-MySQL, конечно.

Мы используем эти настройки:

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

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

table_definition_cache = 400

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

Использование памяти базы данных - сложная тема. MySQL Performance Blog хорошо освещает ваш вопрос и перечисляет множество причин, по которым "резервировать" память крайне нецелесообразно.

Если вы действительно хотите наложить жесткий лимит, вы можете сделать это, но вам придется делать это на уровне операционной системы, поскольку нет встроенных настроек. В 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.


Редактировать:

Обратите внимание, что некоторые имена переменных изменились в более новых версиях MySQL 5.1.x.

Например:

table_cache

Сейчас:

table_open_cache

В /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 = 400» работал на моем старом сервере Centos.

Если вы ищете оптимизацию своего контейнера 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

Другие вопросы по тегам