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

82

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

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

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

Так ли это?

Роберт С. Барнс
источник

Ответы:

109

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

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

эфемерный
источник
1
Отличная информация, спасибо! Но мой основной вопрос все еще остается без ответа, если я подключаю флешку или мой нетбук работает с флеш-диска, поскольку это основной диск, достаточно ли умен ядро, чтобы выбрать noop вместо cfq по умолчанию? Или это полностью зависит от меня, сделать это вручную?
Роберт С. Барнс
3
Вы можете настроить ядро ​​на использование другого планировщика по умолчанию. Было бы разумно автоматически использовать noopна невращающихся носителях, но ядро ​​не имеет такой функции. В нем есть функция обнаружения невращающихся носителей, но это ненадежно, поскольку некоторые диски неверно сообщают о себе, и в любом случае еще не подключены к коду планировщика ввода-вывода.
ephemient
8
Вы можете добавить правила udev для определения планировщика на основе характеристик устройства, как в Debian wiki ( wiki.debian.org/SSDOptimization#Low-Latency_IO-Scheduler ) # установить планировщик крайнего срока для невращающихся дисков ACTION == "добавить | изменить ", KERNEL ==" sd [az] ", ATTR {queue / rotational} ==" 0 ", ATTR {queue / scheduler} =" deadline "
Dani_l
@Dani_l Вы должны расширить это и добавить в качестве ответа.
Роберт С. Барнс,
1
Есть ли способ изменить его для всех дисков сразу во время выполнения? Аналогичным образом настройте планировщик по умолчанию с помощью параметра командной строки ядра "elevator". Благодарю.
SkyRaT
20

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

# 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
Дани_л
источник
Отличный ответ на автоматическое обнаружение невращающихся носителей и применение планировщика ввода-вывода только к ним. Крайний срок рекомендуется не только для не вращающихся носителей. Oracle рекомендует планировщик крайнего срока io для рабочих нагрузок базы данных. Эта рекомендация Oracle, вероятно, исходит из того факта, что крайний срок может лучше обрабатывать синхронную запись, чем другие планировщики ввода-вывода. Поищите, например, / sys / block / sdX / queue / iosched / write_starved "крайний срок", настраиваемый планировщик (для чтения такой настройки нет). Базы данных могут иметь низкую производительность, если их синхронная повторная запись не выполняется быстро.
Tagar
7

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

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

MarkR
источник
Как вы на самом деле меняете его во время выполнения?
Роберт С. Барнс,
Производительность noop по сравнению с другими планировщиками очень сильно зависит от оборудования и конкретной нагрузки. Из любопытства, какие диски, контроллеры и тесты вы запускали?
ephemient
1
Да, noop хорош, когда у вас есть умные RAID-контроллеры и другие вещи, где он знает больше, чем ядро ​​о лучших шаблонах доступа. Срок тоже неплохой.
Zan Lynx
1
Для меня это чисто учебное упражнение, в котором я пытаюсь настроить как можно меньшее и самое быстрое загружаемое ядро, которое обеспечивает все необходимые мне функции на моем ноутбуке. Я просмотрел разделы «Разработка ядра Linux» и «Основные драйверы устройств Linux» и не нашел удовлетворительного ответа на этот вопрос: насколько умно ядро ​​выбирает планировщик во время выполнения или оно просто всегда использует значение по умолчанию, если только вы вручную установили что-то другое?
Роберт С. Барнс,
ephemient>, который был на контроллерах DELL PERC, а также на DELL Powervault MD3000. Казалось лучше, чем по умолчанию (CFQ) на обоих.
MarkR
0

Вы можете установить это при загрузке, добавив параметр "elevator" в командную строку ядра (например, в 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.

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

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

Тим Саванна
источник
-3

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

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

KZcoding
источник
8
Я не понимаю, почему этот ответ заслуживает стольких отрицательных оценок. На самом деле это не так.
DepressedDaniel