Настройка MySQL RDS с нестабильностью WriteIOPS - PullRequest
0 голосов
/ 29 мая 2018

У нас проблемы с настройкой MySQL 5.6 на AWS, и мы ищем указатели для решения некоторых проблем с производительностью.

Раньше у нас были выделенные серверы, и мы могли настраивать их по своему усмотрению.
Наше приложениеиспользует много временных таблиц, и у нас не было проблем с производительностью в этом отношении.
Пока мы не переключились на экземпляр AWS RDS.
Теперь в журналах появляется много медленных запросов, что замедляет работу всего приложения.

Ранее мы работали с MySQL 5.4, а сейчас - 5.6.
Просматривая документы, мы обнаружили некоторые изменения, касающиеся формата временных таблиц по умолчанию.
По умолчанию это InnoDB, и мы вернули его обратно в MYISAM.как мы привыкли и добились улучшения в этом отношении.

первый аспект:

Кроме того, наша БД достаточно велика, и у нас есть сотни одновременных доступ к нашему приложениюи некоторые таблицы требуют вычисления в реальном времени.В этом случае используются Join и Unions.
При разработке приложения (с MySQL 5.4) мы обнаружили, что разбиение больших запросов на 2 или более шагов и использование промежуточных таблиц повышает общую производительность.
Explain показал сортировку файлов и временный файл, чтобы мы могли избавиться от них с временными таблицами.

Является ли разбиение запросов на временные таблицы действительно хорошей идеей?
Редактировать Мы знаем условия онеявное преобразование временных таблиц MEMORY на диск.

Другая вещь, в которой мы не уверены, заключается в том, что делает запрос с использованием временных файлов?
Мы знаем, что использование правильных индексов - это один из способов (использование правильного порядка в предложении where, правильное использование order by и т. д.), но есть ли что-то еще, что мы могли бы сделать?

второй аспект:

Что касается некоторых настроек, которые мы используем, мы имеемнесколько сотен Мбайт для max_heap_table_size и tmp_table_size, поэтому мы надеялись, что наши временные таблицы могут храниться в памяти.

Мы также нашли статьи, описывающиеg, чтобы посмотреть ReadIOPS и WriteIOPS.
Показания стабильны и низки, но записи показывают нестабильные и большие числа.
Вот график:

Left: writes, Right: reads Значения по вертикальной оси - это операции / сек.

Как мы можем интерпретировать эти числа?

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

третий аспект:

Как далеко мы можем пойти с этими настройками, чтобы временные таблицы могли использоваться в памяти?
Например, мы читаем некоторыев статьях, объясняющих, что они установили несколько Гбайт max_heap_table_size на выделенном сервере MySQL с около 12 Гбайт оперативной памяти.(звучит примерно 80% или около того)
Это действительно то, что мы можем попробовать?(Применимы ли те же настройки к RDS?) Кроме того, можем ли мы установить innodb_buffer_pool_size на то же значение?

Примечание Я не могу найти там статью, где я нашел эту информацию,но я мог бы перепутать некоторые имена параметров.Я отредактирую вопрос, если снова найду источник.

Настройки сервера сильно отличаются от того, что у нас было (новые серверы на AWS не установлены нами), и многие значения настроек были увеличеныи некоторые уменьшились.
Мы боимся, что это нехорошо…
Вот некоторые заметные изменения:

  • innodb_buffer_pool_size (увеличено * 6)
  • innodb_log_buffer_size (уменьшено/ 4)
  • innodb_additional_mem_pool_size (уменьшено / 4)
  • sort_buffer_size (уменьшено / 2)
  • myisam_sort_buffer_size (увеличено * 1279) (у нас есть только таблицы innoDB, нам нужнокоснуться этого?)
  • read_buffer_size (увеличено * 2)
  • join_buffer_size (уменьшено / 4)
  • read_rnd_buffer_size (увеличено * 4)
  • tmp_table_size + max_heap_table_size (увеличилось * 8)

Некоторые изменения кажутся нам странными (например, myisam_sort_buffer_size), мы думаем, что использование тех же настроек было бы лучше с самого начала.
Можем ли мы иметь некоторые указатели на эти переменные?(Извините, мы не можем предоставить точные цифры)
Кроме того, есть ли хорошая статья, которую мы могли бы прочитать, которая суммирует хороший баланс между всеми этими параметрами?

Поскольку мы обеспокоены временными таблицамине помещается в памяти, я сделал этот запрос, чтобы увидеть, какой процент запросов фактически записывается на диск:

select 
  tmp_tables
  ,tmp_tables_disk
  ,round( (tmp_tables_disk / tmp_tables) * 100, 2 ) as to_disk_percent
from
  (select variable_value as tmp_tables from information_schema.GLOBAL_STATUS where variable_name = 'Created_tmp_tables') as s1
  ,(select variable_value as tmp_tables_disk from information_schema.GLOBAL_STATUS where variable_name = 
'Created_tmp_disk_tables') as s2

Результат составляет 10 ~ 12% (в зависимости от экземпляра).Это высоко?

TL; DR

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

Вопросы о записи.Есть ли способ диагностировать, что вызывает так много записей?(может быть, связаны с временными таблицами?)

1 Ответ

0 голосов
/ 29 мая 2018

MySQL 5.4 никогда не существовало.Возможно, MariaDB 5.4?

Временные таблицы, даже если казалось бы, не ухудшают производительность, являются подсказкой того, что все может быть улучшено.нужно получить.(Это может привести к тому, что временная таблица в памяти превратится в диск.)

Есть ли у вас TEXT столбцы, которые могут быть меньше VARCHAR?(По той же причине.) Вы понимаете, что INDEX(a,b) может быть лучше, чем INDEX(a), INDEX(b)?(«составной» индекс) Буфер_пул очень важен для производительности.Изменилось ли значение innodb_buffer_pool_size?Сколько данных у вас было / было?Сколько оперативной памяти у вас имеется / было.

В общем, «вы не можете отрегулировать выход из проблемы с производительностью».

Является ли это приложение хранилища данных?Создание и ведение сводных таблиц часто является значительным приростом производительности для «отчетов» DW.

MyISAM имеет только блокировку таблиц.Это приводит к блокировке, что приводит к всевозможным проблемам с производительностью, особенно к замедлению запросов.Я удивлен, что InnoDB был медленнее для вас.MyISAM - это тупик.К тому времени, как вы доберетесь до 8.0, у вас появятся еще более веские причины для переключения.

Давайте посмотрим на один из медленных запросов, которые выиграли от разделения.Существует несколько методов ускорения выполнения сложных запросов (по крайней мере, в InnoDB).

Порядок ANDed вещей в WHERE не имеет значения , а не .Это имеет значение в составных индексах.

Изменение tmp_table_size редко помогает или причиняет боль.Однако следует хранить менее 1% ОЗУ, чтобы избежать нехватки ОЗУ.Меняется местами худшее .

Графики - каковы единицы по оси Y?Откуда взялись графики?Они выглядят бесполезными.

"Гб max_heap_table_size на выделенном сервере MySQL с примерно 12 Гб оперативной памяти (звучит примерно на 80%)" - проверьте эту статью еще раз.Я рекомендую 120M для этой настройки на этом компьютере.

При использовании MyISAM исключительно на компьютере 12 ГБ, key_buffer_size должно быть около 2400M и innodb_buffer_pool_size должно быть 0.

При использовании исключительно InnoDBна машине с 12 ГБ значение key_buffer_size должно составлять около 20 М, а innodb_buffer_pool_size должно составлять 8 ГБ.Вы меняли их, когда тестировали InnoDB?

innodb_additional_mem_pool_size - Не используется и в конечном итоге удален.

myisam_sort_buffer_size - 250M на машине 12G.Если используется только InnoDB, настройку можно игнорировать, поскольку этот буфер не будет использоваться.

Что касается * 6 и / 4 - мне нужно увидеть реальные размеры, чтобы судить о чем-либо.

«суммирует хороший баланс между всеми этими параметрами» - две вещи:

Дополнительные советы по настройке, а также рекомендации по Slowlog см. http://mysql.rjweb.org/doc.php/mysql_analysis

...