Я пытался устранить проблему с вводом-выводом на моих дисках. Настройка выглядит следующим образом:
/dev/sda
, /dev/sdb
)/dev/sda1
, /dev/sdb1
)/dev/md0
)/dev/VolGrp00/RootLV
)Изначально я заметил, что при выполнении тяжелых операций ввода-вывода (т.е. mkfs
), система будет медленно сканировать до такой степени, что я не смогу переместить указатель мыши в своем X-сеансе. Я начал регистрировать некоторые показатели и увидел, что средняя нагрузка будет медленно расти, до уровня выше 5,0 на моем двухъядерном сервере. В то же время объем моей памяти увеличился с почти 2 ГБ до примерно 10 МБ и почти 2 ГБ буфера. Исходя из этого, я подозреваю, что виновато какое-то кеширование, но я недостаточно знаком с основами LVM, MD и подсистемой ввода-вывода Linux, чтобы знать, с чего начать.
Я обнаружил одну странность: кажется, не имеет значения, снимаю ли я слой LVM и пишу непосредственно в массив, и даже удаление массива не очень помогает (хотя запись непосредственно в раздел, похоже, вызывает более короткие всплески задержек. чем запись в массив).
Большая часть моих тестов проводилась с помощью команды mkfs.ext4 -i 4096 -m 0 <device>
, хотя я тестировал это поведение с dd if=/dev/urandom bs=4K of=<device>
и получил аналогичные результаты, так что я почти уверен, что это не вина mkfs. Кроме того, я пробовал это на другой системе (от другого поставщика оборудования, но все еще CentOS 5.6) и снова вижу аналогичные результаты.
Я согласен с любыми решениями, из-за которых мои операции ввода-вывода занимают немного больше времени, хотя ответы типа «использовать флаг прямого ввода-вывода» неприемлемы, поскольку они заставляют mkfs увеличиваться с 10 минут до 16 часов (были там , пробовал). Я ищу параметры настройки, а также изучаю возможность изменения планировщиков ввода-вывода, но я подумал, что было бы полезно попросить сообщество дать рекомендации в правильном направлении.
РЕДАКТИРОВАТЬ :
Как оказалось, проблема больше связана с нехваткой памяти и диспетчером виртуальной памяти, вызывающим блокировку запросов ввода-вывода. Вот мое текущее понимание проблемы: mkfs
или dd
при запуске они генерируют больше операций ввода-вывода, чем могут справиться диски, поэтому буфер начинает заполняться. Как vm.dirty_ratio
достигнуто, запросы ввода-вывода от всех процессов начинают блокироваться, пока кеш не очистит некоторое пространство (источник). В то же время условия нехватки памяти заставляют ядро начать перекачку процессов из физической памяти на диск ... это генерирует еще больше операций ввода-вывода, и эти запросы ввода-вывода могут блокироваться в ожидании очистки кеша.
Я пробовал тюнинг vm.dirty_ratio
и другие связанные параметры, но они изменяются только тогда, когда система начинает замедляться (более низкий коэффициент = более быстрое зависание). Я также пробовал поменять местами планировщики ввода-вывода и настроить их параметры, чтобы попытаться очистить кеш быстрее, но безуспешно. В крайнем случае, я попытался запустить mkfs
с участием ionice -c3
, но поскольку диски в основном простаивают в то время, когда я запускаю mkfs
, проявляется та же проблема. Я думаю, что замедления можно было бы избежать, если бы существовал способ ограничить частоту запросов ввода-вывода определенного процесса, но я не знаю ничего, что могло бы это сделать.
Я определенно по-прежнему открыт для предложений относительно того, что попробовать - тот, кто может подтолкнуть меня в правильном направлении, получит зеленую галочку.
ДРУГОЙ РЕДАКТИРОВАНИЕ:
Я наткнулся на контрольные группы, но, к сожалению, они доступны только начиная с RHEL6. Cgroups могут использоваться для запуска mkfs в группе с регулируемым блочным вводом-выводом, но, поскольку эти системы должны оставаться на уровне 5.6, мне придется либо продолжать поиск другого решения, либо решать проблемы с медленностью до времени обновления.
Судя по скудным подробностям, которые вы нам предоставили, мне кажется, что вам нужно настроить планировщик ввода-вывода. Это может существенно повлиять на эффект блокировки, который вы испытываете. Я считаю, что CentOS 5.6 использует CFQ. Вы можете получить меньше блокировок с крайним сроком.