Главная‎ > ‎

IO Scheduler


Сайт переехал


Noop I/O Scheduler

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

Deadline I/O Scheduler

Deadline I/O Scheduler хранит отсортированную очередь, и вводит две дополнительные очереди: FIFO очередь на чтение и FIFO очередь на запись. Записи в каждой из этих очередей отсортированы по времени поступления (фактически, первый вошел -
первый вышел). Каждому запросу в очереди FIFO назначено время окончания. Для очереди запросов чтения - это 500 миллисекунд. Для очереди запросов записи - это пять секунд. При поступлении нового I/O запроса, он вставляется-сортируется в стандартную очередь и помещается в конец соответствующей (на чтение или запись) FIFO очереди.
Как правило, к жесткому диску посылаются запросы ввода/вывода с головы стандартной отсортированной очереди. Это максимизирует общую пропускную способность при минимизации операций поиска и установки головок на диске, так как нормальная очередь сортируется по номеру блока (как и с Linus Elevator). Когда у записи вначале списка одной из дополнительных FIFO очередей истечет назначенное время, I/O scheduler останавливает обработку I/O запросов из стандартной очереди, и начинает обслуживание запросов из этой FIFO очереди. I/O scheduler проверяет и обрабатывает запросы только с головы очереди, где находятся старейшие запросы.
Таким образом, Deadline I/O Scheduler поддерживает эффективную общую пропускную способность без голодания какого-либо одного запроса недопустимо длительное время. Проблема writes-starving-reads сводится к минимуму.


Anticipatory (упреждающий) I/O Scheduler

Проблема предыдущих планировщиков ввода/вывода вновь вытекает из зависимости: каждый новый запрос на чтение выдается только тогда, когда предыдущий будет возвращен, но к тому времени, когда приложение получает прочитанные данные и посылает следующий запрос на чтение, I/O планировщик уже начал обслуживание других запросов. В этом случае планировщик
ввода/вывода в течении некоторого времени мог бы подождать поступление следующего запроса на чтение. Именно так и работает Anticipatory I/O Scheduler. Он основан на Deadline I/O Scheduler с добавлением механизма ожидания, до шести миллисекунд, следующего чтения. Если 6-ть миллисекунд истекли, но запроса на чтение не поступило, планировщик возвращается к работе, которую выполнял до этого (например, обслуживание стандартной отсортированной очереди).


CFQ IO Scheduler

В CFQ каждому процессу присваивается собственная очередь, и каждой очереди присваивается квант времени (timeslice). Планировщик ввода/вывода по кругу обходит каждую очередь и обслуживает запросы из очереди до тех пор, пока не будет исчерпан лимит времени (timeslice) или не останется запросов в этой очереди. В последнем случае CFQ планировщик будет ждать, по умолчанию 10-мс, нового запроса из очереди. Если ожидание было напрасным, то планировщик переходит к следующей очереди.
В рамках каждой очереди процесса, синхронизированные запросы (как, например, читающие) имеют приоритет над
несинхронизированными запросами. Таким образом, CFQ способствует чтению и предотвращает проблему 
writes-starving-reads.
CFQ планировщик хорошо подходит для большинства задач.
в ядрах 2.6.32 и новее можно немного повысить производительность на сервере путём отключения low latency , включенного по умолчанию, которое снижает пиковую производительность, но повышает отзывчивость, нужную только для десктопа.
отключить

echo 0 > /sys/class/block/<device name>/queue/iosched/low_latency 
________________________________________________

посмотреть используемый планировщик

cat /sys/block/<HDD>/queue/scheduler 

если выбран метод anticipatory, то на выводе будет показано следующее:

noop [anticipatory] deadline cfq

Чтобы заменить его на cfq (например), делаем следующее:

echo cfq > /sys/block/<HDD>/queue/scheduler 

и если мы еще раз выведем содержимое файла, то увидим:

noop anticipatory deadline [cfq]


добавьте  

echo cfq > /sys/block/<HDD>/queue/scheduler

в /etc/rc.d/rc.local 

или при сборке ядра выберите планировщик в

Enable the block layer --->IO Schedulers --->XXX I/O scheduler поддержка желаемых планировщиков

Enable the block layer --->IO Schedulers --->Default I/O scheduler планировщик, который будет использоваться по умолчанию

BFQ IO Scheduler 

Планировщик BFQ (Budget Fair Queueing I/O Scheduler) создан как замена CFQ (и основан на его коде), основная мысль – более честное разделение I/O между процессами.
Он существует пока в beta-варианте и в официальную поставку ядра не включен. Однако, патч вполне стабилен и лично у меня никаких проблем не вызвал.
Работает планировщик отлично – тормоза GUI во время активной работы с диском фоновых процессов (например, загрузки виртуальной машины или обновления дерева portage) просто как рукой сняло.

Патчи можно взять здесь


Последняя поддерживаемая версия ядра по ссылке – 2.6.30 
для ядра 2.6.31, 2.6.32, 2.6.34 по ссылкам дальше

Скачиваем патчи 
Переходим в /usr/src/linux
Патчим:

patch -p1 < BFQ-2.6.32.patch

make menuconfig

Block layer -> I\O schedulers ставим BFQ=m (модуль - для теста - дальше можно прямо в ядро), сохраняемся, выходим,собираем.

modprobe bfq-iosched

Проверяем, загрузился ли модуль:

cat /sys/block/<HDD>/queue/scheduler, должно быт что-то вроде 

no-op [cfq] bfq

Включаем:

echo «bfq» > /sys/block/<HDD>/queue/scheduler

Снова проверяем, изменился ли планировщик.
Радуемся увеличению производительности.

P.S.

патч для 2.6.32 ядра имеем благодаря georgy http://www.linux.org.ru/view-message.jsp?msgid=4341449
патч ниже это 3 патча для 2.6.30 и *.diff  выложенный по ссылке выше, обьединённые в один файл - патч ложится без проблем :)



Подстраницы (1): NCQ
ċ
BFQ-2.6.32.patch
(152k)
megabaks,
30 дек. 2009 г., 00:59
ċ
megabaks,
8 июл. 2010 г., 09:00
ċ
megabaks,
7 авг. 2010 г., 09:04
ċ
megabaks,
21 окт. 2010 г., 10:58
ċ
megabaks,
5 янв. 2011 г., 13:09
ċ
linux-2.6.31.12-block-iosched--bfq.diff.gz
(36k)
megabaks,
6 апр. 2010 г., 09:52
Comments