Выбор планировщика ввода-вывода Linux - PullRequest
81 голосов
/ 18 июня 2009

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

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

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

Так ли это?

Ответы [ 5 ]

109 голосов
/ 18 июня 2009

Как указано в /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 часто является лучшим выбором для блочных устройств с поддержкой памяти (например, флешек) и других невращающихся носителей (флэш), где попытка перепланировать ввод-вывод является пустой тратой ресурсов
  • deadline - это легкий планировщик, который пытается установить жесткое ограничение задержки
  • cfq пытается поддерживать справедливость пропускной способности ввода-вывода в масштабе всей системы

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

19 голосов
/ 03 февраля 2016

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

# 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). Этот ответ основан на вики Debian

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

for f in /sys/block/sd?/queue/rotational; do printf "$f "; cat $f; done
7 голосов
/ 18 июня 2009

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

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

0 голосов
/ 12 декабря 2018

Вы можете установить это при загрузке, добавив параметр "elevator" в cmdline ядра (например, в grub.cfg)

Пример:

elevator=deadline

Это сделает «крайний срок» планировщиком ввода / вывода по умолчанию для всех блочных устройств.

Если вы хотите запросить или изменить планировщик после загрузки системы или хотите использовать другой планировщик для определенного блочного устройства, я рекомендую установить и использовать инструмент ioschedset , чтобы сделать это просто.

https://github.com/kata198/ioschedset

Если вы используете Archlinux, он доступен в aur:

https://aur.archlinux.org/packages/ioschedset

Пример использования:

# Get i/o scheduler for all block devices
[username@hostname ~]$ io-get-sched
sda:    bfq
sr0:    bfq

# Query available I/O schedulers
[username@hostname ~]$ io-set-sched --list
mq-deadline kyber bfq none

# Set sda to use "kyber"
[username@hostname ~]$ io-set-sched kyber /dev/sda
Must be root to set IO Scheduler. Rerunning under sudo...

[sudo] password for username:
+ Successfully set sda to 'kyber'!

# Get i/o scheduler for all block devices to assert change
[username@hostname ~]$ io-get-sched
sda:    kyber
sr0:    bfq

# Set all block devices to use 'deadline' i/o scheduler
[username@hostname ~]$ io-set-sched deadline
Must be root to set IO Scheduler. Rerunning under sudo...

+ Successfully set sda to 'deadline'!
+ Successfully set sr0 to 'deadline'!

# Get the current block scheduler just for sda
[username@hostname ~]$ io-get-sched sda
sda:    mq-deadline

Использование должно быть самоочевидным. Инструменты автономны и требуют только bash.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Отказ от ответственности, это сценарии, которые я написал.

0 голосов
/ 14 ноября 2012

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

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

...