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

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

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

Ответ 1

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

Оборудование

Аппаратное обеспечение является очевидной частью. Чем больше RAM, тем веселее, быстрее диски 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 server, поскольку среди много вкладов от таких компаний, как Facebook и Google (они знают быстро), также включает собственную замену на Percona для InnoDB, называемую XtraDB.

См. мой gist для настройки 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 script (подсказка: вам понадобится linux), который выводит результат SHOW VARIABLES и SHOW STATUS и заверяет его в надежную полезную рекомендацию. Если ваш сервер работает некоторое время, рекомендация будет лучше, так как будут данные для их базы.

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

Чтение

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

Другим важным ресурсом является planet-mysql, конечно.

Ответ 2

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

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

Ответ 3

Использование памяти базы данных - сложная тема. Блог эффективности 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

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


Edit:

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

Например:

table_cache

Теперь:

table_open_cache

Ответ 4

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

table_definition_cache = 400

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

Ответ 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 МБ.