Устранение неполадок с низкой производительностью дискового ввода-вывода
Обратите внимание, что хотя этот вопрос немного специфичен для 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-секундными выборками и предоставит некоторую информацию о скорости чтения / записи, времени обслуживания ввода-вывода и времени ожидания. Мне также нравится коллекционирование для этой цели.