Устранение неполадок с низкой производительностью дискового ввода-вывода

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

У нас есть Ubuntu VM внутри хоста Xen XCP на основе Ubuntu (установленного на двух жестких дисках в программном RAID1). Эта виртуальная машина работает на сервере Redis под нагрузкой около 2 Кб / с.

Проблема: когда указанный сервер Redis делает BGREWRITEAOF он блокирует своих клиентов примерно на 10 секунд.

Подробности:

Используется только постоянство AOF, без RDB. Redis настроен на fsync AOF-файл один раз в секунду.

На BGREWRITEAOF Redis разветвляется и выполняет всю дисковую работу в дочернем процессе. Тем временем основной процесс продолжает добавлять данные в свой файл AOF.

BGREWRITEAOF занимает около 10 секунд (1,5 ГБ данных, скорость записи на диск 150 МБ / с). Дочерний процесс, выполняющий перезапись, потребляет всю пропускную способность записи ввода-вывода HDD.

Родительский процесс пытается fsync, требуется более двух секунд, защита данных включается и блокируется write вызывается, блокируя родительский процесс до BGREWRITEAOF закончил с диском.

Вот подробная информация и обсуждение, которые приведут меня к приведенной выше интерпретации событий.

Вопрос: Мне кажется подозрительным, что процессу разрешено принимать столько дискового ввода-вывода, что все остальное блокируется. Есть ли что-то, что я могу сделать на системном уровне, чтобы это исправить? Я в порядке, если BGREWRITEAOF займет немного больше времени, пока родительскому процессу разрешено сохранять свои данные, пока перезапись активна.

Обратите внимание, что мне известны обходные пути, такие как перенос персистентности AOF в подчиненный режим с использованием no-appendfsync-on-rewrite Опция конфигурации Redis и т.д.; этот вопрос конкретно о решении проблемы, а не обойти ее.

2 ответа

AFAICS вы можете попробовать изменить планировщик ввода-вывода. Попробуйте использовать эту команду:

echo cfq > /sys/block/$DEVICE/queue/scheduler

Где $DEVICE - это ваш диск RAID1. Эта команда устанавливает планировщик "Совершенно честной очереди" для вашего устройства.

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

Подумайте об изменении лифта ввода-вывода на крайний срок или алгоритма noop и повторите тестирование. Вы можете сделать это изменение на лету, используя технику, описанную в другом ответе. Добавьте запись в команду ядра GRUB, например, чтобы она сохранялась при перезагрузке (добавьте: elevator=deadline)

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

Наконец, вы можете попробовать некоторые инструменты для сравнительного анализа, чтобы увидеть, что происходит. Если у вас есть доступ к iostatНапример, вы можете запустить его в другом окне терминала во время тестирования вашего приложения.

Например iostat -x 1 будет работать с 1-секундными выборками и предоставит некоторую информацию о скорости чтения / записи, времени обслуживания ввода-вывода и времени ожидания. Мне также нравится коллекционирование для этой цели.

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