Ошибка MySQL на сервере на базе SSD. Маленькие столы. Конфигурация MySQL? RAID?

У меня есть пара серверов в промышленных условиях (сеть с воздушным зазором), которые выполняют довольно легкий сбор данных телеметрии. Мы генерируем около 10 ГБ истории телеметрии за ~ 30 дней.

Вся телеметрия представлена ​​в виде таблиц, разделенных на два типа: текущее состояние и история. Таблицы состояний обычно содержат 16 строк или меньше. Таблицы истории могут быть довольно большими, но общий размер составляет около 11 ГБ. Телеметрия поступает со скоростью чуть менее 100 выборок в секунду, а таблицы истории обновляются только в том случае, если что-то меняется или прошло 30 секунд. По моим предварительным проверкам, обновление истории пропускается примерно 9 раз из 10. Таким образом, в большинстве случаев каждая выборка приводит к одному REPLACE INTO в одной из примерно шести таблиц.

Это все. работает на стандартном сервере Ubuntu 14.04 (64-разрядная версия), нагрузка на серверы Supermicro 1U с процессорами Xeon с 2015 года или около того. Меня нет на заводе, поэтому я не могу проверить точную модель.

Каждый сервер имеет 32 ГБ ОЗУ ECC.

Диски имеют конфигурацию RAID 1 с 4 дисками (технические специалисты на заводе не действуют быстро, когда диск выходит из строя, поэтому нам нужно много резервных копий). Все диски постоянно контролируются с помощью smartctl, и когда один из них показывает сбой или предупреждение, мы заменяем его. В декабре, мы заменили диски на одном из серверов и проделали то же самое с другим.

На обоих серверах производительность MySQL обычно хорошая, время отклика на обновления таблиц состояния составляет однозначное число миллисекунд. Однако мы получаем очень резко отклоняющиеся значения. Время от времени, несколько раз в день и обычно чаще, чем один раз в час, мы видим, что один REPLACE INTO в 16-строчной таблице состояния занимает> 1,5 секунды. Это вызывает тревогу, что мы потеряли телеметрию, так что это более чем раздражает.

Все таблицы являются InnoDB, по одному файлу на таблицу. Discard включен для файловой системы (ext4). Я попытался изменить параметры MySQL, чтобы отключить синхронизацию при фиксации (вместо использования периодической синхронизации), и это, похоже, не имело никакого эффекта. У меня для InnoDB настроен журнал размером 1 ГБ, а сами файлы базы данных значительно меньше ОЗУ.

RAM - это в основном (~ 60%) кэшированные данные.

Я попытался изменить типы таблиц таблиц состояния на MyISAM, но проблема не исчезла.

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

Тот факт, что MyISAM ничего не изменил (и я имею в виду, что не было вообще никаких заметных изменений в поведении), заставляет меня подозревать, что RAID.

Диски абсолютно новые (менее двух недель назад) диски Crucial MX500, 1 ТБ. Да, это потребительские диски, но скорость записи довольно низкая. И мы все время поддерживаем заполненность файловой системы менее чем на 40%.

Я не знаю, что попробовать дальше. Это проблема с RAID? Это проблема конфигурации MySQL?

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

Таблицы состояния / состояния действительно имеют первичные ключи для обеспечения уникальности данных.

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

Мне не хватило ума установить iostat на серверах, когда они были впервые установлены. Однако первоначальные тесты с hdparm -tT, казалось, показали, что на базовых дисках все в порядке. Никакие диски не показывают проблем в smartctl.

Замена дисков производилась по очереди, так что RAID фактически является старым RAID (который был основан на MX200). RAID не был перестроен с нуля при замене дисков.

Есть ссылки на известную проблему с этой версией MySQL (что-то вроде 5.5) и REPLACE INTO, но ничто из того, что я читал, не говорит о том, что я должен увидеть изменение в производительность такая большая.

Мы будем благодарны за любые идеи!

0
задан 1 July 2018 в 18:58
1 ответ

Задержка во время записи (которую вы, кажется, делаете в основном) может означать, что innodb_log_file_size заполнен и ожидает очистки. Размер по умолчанию для них в 5.5 ужасно мал. Увеличение размера до 512 МБ и экземпляров до 4 было бы хорошим началом. Следуйте приведенной ниже ссылке. Следите за разницей отметок времени на них во время загрузки данных (верхний уровень каталога данных). Если они все примерно в одну и ту же минуту, они недостаточно велики. Также посмотрите вывод SHOW ENGINES INNODB STATUS .

ref: изменение размера журнала повторения вручную Хотя я бы убрал старые файлы, а не удалял их, чтобы вы могли при необходимости переместите их обратно. Резервные копии сохраняют задания.

innodb_buffer_pool_size также должен быть установлен таким образом, чтобы он удерживал активный рабочий набор (70% доступной оперативной памяти - хорошее начало, а затем посмотрите на ПОКАЗАТЬ ГЛОБАЛЬНЫЙ СТАТУС , чтобы узнать, сколько используется).

Убедитесь, что журнал медленных запросов включен с соответствующим порогом, это поможет обнаружить другие медленные запросы.

ссылка: руководство журнала медленных запросов

0
ответ дан 5 December 2019 в 05:47

Теги

Похожие вопросы