Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

6.4. Планировщики

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

6.4.1. CFQ

Планировщик (CFQ, Completely Fair Queuing) равномерно распределяет ресурсы между запросами в соответствии с их приоритетом. Процессы подразделяются на три класса: RT (realtime), BE (best effort) и бездействующие (idle). Приоритет может быть присвоен процессу вручную с помощью команды ionice или программно с помощью ioprio_set. По умолчанию процессы обслуживаются в порядке очереди (best effort). Процессы классов RT и BE дополнительно могут иметь приоритет от 0 до 7 (чем меньше значение, тем выше приоритет). Процессы класса RT имеют наивысший приоритет, поэтому нужно его использовать с большой осторожностью, потому что это может значительно ограничить время обслуживания менее приоритетных процессов. Процессы BE имеют приоритет 4. Бездействующие процессы (idle) обслуживаются в последнюю очередь.
CFQ выделяет процессам интервалы времени на обслуживание. Во время обслуживания по умолчанию процесс может отправлять 8 запросов ввода-вывода. Планировщик пытается предсказать число запросов исходя из прошлой статистики. Так, если ожидается поступление дополнительных запросов, CFQ перейдет в режим ожидания, даже если в это время другие процессы ожидают обработки.
Однако ожидание приводит к простою оборудования, что особенно ощутимо на высокоскоростных накопителях (SSD и внешних массивах даннхы). Поэтому при использовании CFQ может потребоваться откорректировать настройки в /sys/block/устройство/queue/iosched/.
slice_idle = 0
quantum = 64
group_idle = 1
Даже если group_idle=1, вероятность простоев не исключена, но это будет происходить намного реже.
Как уже упоминалось выше, CFQ может находиться в режиме ожидания запросов, в то время как другие процессы ожидают обслуживания. Как следствие, использование нескольких таких планировщиков может значительно снизить производительность, как например, CFQ в комбинации с аппаратным RAID-контроллером. В этом случае RAID-контроллер может использовать собственный планировщик, что только ухудшит ситуацию. Дело в том, что планировщик нижнего уровня получает только те данные, которые проходят через планировщик верхнего уровня, что не отражает действительный уровень нагрузки.

Параметры

back_seek_max
Обратный поиск характеризуется более длительными задержками и негативно влияет на производительность. Этот параметр ограничивает расстояние для обратного поиска (в килобайтах). По умолчанию составляет 16 КБ.
back_seek_penalty
Так как обратный поиск характеризуется низкой эффективностью, за его выполнение будет назначаться штраф. Представим, например, что головка диска расположена на позиции 1024 КБ, а очередь обслуживания содержит два запроса — к позициям 1008 КБ и 1040 КБ. Оба запроса одинаково удалены от текущего расположения. Однако с учетом штрафа на обратный поиск (по умолчанию 2), запрос обращения к позиции 1040 КБ будет выполнен первым.
fifo_expire_async
Максимальное время ожидания обслуживания асинхронной записи (через буфер). По умолчанию равно 250 миллисекундам. После его истечения один запрос будет перенесен в очередь для передачи.
fifo_expire_sync
Аналогично fifo_expire_async, но для синхронных запросов. По умолчанию равно 125 мс.
group_idle
Переводит CFQ в режим ожидания после обслуживания последнего процесса в cgroup. Должен быть равен 1 при использовании равноценных групп cgroup, и при этом slice_idle равен 0.
group_isolation
1 включает изоляцию групп, даже если при этом пострадает производительность. Изоляция групп позволяет равномерно обрабатывать нагрузку, которая поступает последовательно и случайно. Если изоляция отключена (0), нагрузка будет обрабатываться последовательно. Подробную информацию можно найти в Documentation/cgroups/blkio-controller.txt.
low_latency
Если равно 1 (по умолчанию), CFQ предоставляет процессам максимальное время ожидания (300 миллисекунд). Это позволяет обслуживать запросы более равномерно, но за счет снижения скорости. Значение 0 отключает ожидание.
quantum
Этот параметр контролирует число запросов ввода-вывода, передаваемых хранилищу за один раз, и тем самым ограничивает длину очереди. По умолчанию равен 8. Следует соблюдать осторожность при увеличении значения, так как это может отрицательно повлиять на производительность при высоких уровнях нагрузки.
slice_async
Контролирует интервал времени, предоставляемый процессам, запрашивающим асинхронный ввод-вывод. По умолчанию равен 40 миллисекундам.
slice_idle
Определяет время ожидания поступления запросов. В Red Hat Enterprise Linux 6.1 и предыдущих выпусках равно 8 миллисекундам, а начиная с Red Hat Enterprise Linux 6.2 — 0. Нулевое значение может ухудшить производительность внешних RAID-накопителей, так как возрастет общее число операций поиска. Для других типов накопителей рекомендуется использовать положительное значение.
slice_sync
Контролирует интервал времени, предоставляемый процессам, запрашивающиму синхронный вводв-вывод. По умолчанию равен 100 миллисекундам.