Выбор планировщика ввода-вывода Linux

Я прочитал, что предположительно можно изменить планировщик ввода-вывода для конкретного устройства на работающем ядре, написав в/sys /block/[disk]/queue/scheduler. Например, я могу видеть в своей системе:

anon@anon:~$ cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 

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

это дело?

4 ответов


как описано в /usr/src/linux/Documentation/block/switching-sched.txt, планировщик ввода-вывода на любом конкретном блочном устройстве может быть изменен во время выполнения. Может быть некоторая задержка, поскольку все запросы предыдущего планировщика сбрасываются перед использованием нового планировщика, но его можно изменить без проблем, даже когда устройство находится в интенсивном использовании.

# cat /sys/block/hda/queue/scheduler
noop deadline [cfq]
# echo anticipatory > /sys/block/hda/queue/scheduler
# cat /sys/block/hda/queue/scheduler
noop [deadline] cfq

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

  • noop часто является лучшим выбором для устройств с поддержкой памяти (например, ramdisks) и других невращающихся носителей (flash), где попытка перенести ввод-вывод является пустой тратой ресурсов
  • deadline Это легкий планировщик, который пытается поставить жесткий предел задержки
  • cfq пытается поддерживать общесистемную справедливость пропускной способности ввода-вывода

по умолчанию anticipatory долгое время он получал много тюнинга, но был удален в 2.6.33 (начало 2010 года). cfq стал по умолчанию некоторое время назад, поскольку его производительность разумна и справедливость является хорошей целью для многопользовательских систем (и даже однопользовательских настольных компьютеров). Для некоторых сценариев -- базы данных часто используются в качестве примеров, поскольку они, как правило, уже имеют свои собственные шаблоны планирования и доступа и часто являются большинство важное обслуживание (так кто заботится о справедливость?) -- anticipatory имеет долгую историю перестройки для лучшей производительности при этих рабочих нагрузках и deadline очень быстро передает все запросы к базовому устройству.


можно использовать правило udev, чтобы позволить системе принять решение о планировщике на основе некоторых характеристик hw.
Пример правила udev для SSDs и других невращающихся дисков может выглядеть как

# set noop scheduler for non-rotating disks
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"

внутри нового файла правил udev (например,/etc/udev/rules.d/60-ssd-scheduler.rules). Этот ответ основан на Вики

чтобы проверить, будут ли ssd-диски использовать правило, можно заранее проверить атрибут триггера:

for f in /sys/block/sd?/queue/rotational; do printf "$f "; cat $f; done

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

на современном оборудовании серверного класса, только noop один, кажется, вообще полезным. Другие, кажется, медленнее в моих тестах.


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

планировщик по умолчанию выбирается при запуске на основе содержимого файла, расположенного в /linux-2.6 / block / Kconfig.iosched. Однако можно изменить планировщик ввода-вывода во время выполнения с помощью echoввод допустимого имени планировщика в файл, расположенный по адресу /sys/block/[DEV]/queue / scheduler. Например, echo deadline > /sys/block/hda/queue/scheduler