Вопрос

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

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

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

Так ли это на самом деле?

Это было полезно?

Решение

Как задокументировано в /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 для твердотельных накопителей и других невращающихся накопителей может выглядеть следующим образом

# 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 wiki

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

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

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

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

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

Пример:

elevator=deadline

Это сделает "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.

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

Редактировать:Отказ от ответственности, это сценарии, которые я написал.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top