Май 24 2010

IO Scheduler

Published by

NCQ

NCQ — Native Command Queuing — аппаратная установка очередности команд — технология, использующаяся в SATA-устройствах начиная с SATA/300 для повышения быстродействия. Устройства с поддержкой NCQ способны принимать несколько запросов одновременно и реорганизовывать порядок их выполнения для достижения максимальной эффективности (производительности) с учётом внутренней архитектуры устройства (минимизируя количество перемещений головок и ожидание нужного сектора на треке). NCQ повышает производительность задач, связанных с произвольным чтением, обработкой данных от двух и более источников, одновременную работу нескольких программ. (Типичная нагрузка для сервера — одновременное выполнение запросов от нескольких клиентов).

Для использования  NCQ требуются:

Жесткий диск с поддержкой NCQ (все произведенные в последние годы)
Контроллер с поддержкой AHCI, или же проприетарный — Promise, HighPoint, Silicon Image.

проверить поддерживается ли NCQ контроллером и работает ли он
Работает:

dmesg |grep NCQ
ahci 0000:00:0e.0: controller can do NCQ, turning on CAP_NCQ
ata1.00: 976773168 sectors, multi 16: LBA48 NCQ (depth 31/32), AA
ata3.00: 625142448 sectors, multi 16: LBA48 NCQ (depth 31/32), AA

Поддерживается контроллером, но не работает из-за драйвера:

dmesg|grep NCQ
ata3.00: 1465149168 sectors, multi 16: LBA48 NCQ (depth 0/32)

Не поддерживается контроллером:

~$ dmesg|grep NCQ
~$

если контроллер поддерживает, но не работает из-за драйвера, то надо проверить включена ли поддержка AHCI

zgrep AHCI /proc/config.gz
CONFIG_SATA_AHCI=y

если n — нужно включить

  • Device Drivers  —> Serial ATA (prod) and Parallel ATA (experimental) drivers  —> AHCI SATA support

выбрать в качестве планировщика noop
пересобрать ядро — загрузиться с него и снова проверить работает ли NCQ
контроллеры Intel с поддержкой NCQ


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/HDD/queue/iosched/low_latency


BFQ IO Scheduler

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

Патчи можно взять здесь
http://feanor.sssup.it/~fabio/linux/bfq/patches/
Последняя поддерживаемая версия ядра по ссылке – 2.6.30

новая страница проекта http://algo.ing.unimo.it/people/paolo/disk_sched/sources.php

для ядра 2.6.31,2.6.32, 2.6.34, 2.6.35, 2.6.36, 2.6.37

Скачиваем патчи
Переходим в /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

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




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

HDD - это ваш винт, например sda,sdb и т.д.
планировщик - это cfq, bfq, noop и т.д.
посмотреть используемый планировщик:

cat /sys/block/HDD/queue/scheduler

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

noop [anticipatory] deadline cfq

Есть несколько способов изменить планировщик:

  • В реальном времени:

    echo "планировщик" > /sys/block/HDD/queue/scheduler

    чтобы это происходило при каждой загрузке:
    добавьте

    echo "планировщик" > /sys/block/HDD/queue/scheduler

    в /etc/rc.d/rc.local или аналог (зависит от используемой системы иницализации:OpenRC, Upstart и т.д.)

  • При сборке ядра:
    • Enable the block layer --->IO Schedulers --->XXX I/O scheduler (где XXX имя планировщика) - поддержка желаемых планировщиков

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

    elevator=планировщик

16 responses so far

16 Responses to “IO Scheduler”

  1. vurdalakon 27 Ноя 2010 at 22:19

    У меня пишет

    ata2.00: 625142448 sectors, multi 16: LBA48 NCQ (depth 0/32)

    То есть вроде как не работает из-за драйвера. Но в то же время CONFIG_SATA_AHCI=y. Что дальше делать и как заставить его работать?

  2. megabakson 28 Ноя 2010 at 10:22

    никак

  3. vurdalakon 28 Ноя 2010 at 12:40

    Чудесно :)

  4. VOzon 06 Дек 2010 at 22:37

    2 vurdalak

    # dmesg |grep NCQ
    [    1.380426] ata1.00: 488397168 sectors, multi 16: LBA48 NCQ (depth 31/32)
    # dmesg |grep ahci
    [    1.021235] ahci 0000:00:1f.2: version 3.0
    [    1.021261] ahci 0000:00:1f.2: PCI INT B -&gt; GSI 19 (level, low) -&gt; IRQ 19
    [    1.021340] ahci 0000:00:1f.2: irq 28 for MSI/MSI-X
    [    1.021414] ahci 0000:00:1f.2: AHCI 0001.0100 32 slots 3 ports 3 Gbps 0x1 impl SATA mode
    [    1.021417] ahci 0000:00:1f.2: flags: 64bit <strong>ncq</strong> sntf pm led clo pio slum part
    [    1.021427] ahci 0000:00:1f.2: setting latency timer to 64
    [    1.021559] scsi0 : ahci
    [    1.021665] scsi1 : ahci
    [    1.021718] scsi2 : ahci
  5. unikumon 17 Июл 2011 at 18:32

    Планировщик по умолчанию можно передать параметром ядра «elevator=noop|cfq|deadline».

  6. megabakson 17 Июл 2011 at 18:48

    каюсь
    забыл об этом
    //fixed

  7. dan[T]eon 06 Янв 2012 at 12:51

    У меня пишет

    ata2.00: 625142448 sectors, multi 16: LBA48 NCQ (depth 0/32)

    То есть вроде как не работает из-за драйвера. Но в то же время CONFIG_SATA_AHCI=y. Что дальше делать и как заставить его работать?

    А вы проверили настройки BIOS? У меня в биосе изначально было включено просто Enhanced mode (мать p5k se epu).
    А надо включить AHCI mode. (После этого скорее всего не запуститься windows. Как решить проблему в гугле написано)

  8. megabakson 06 Янв 2012 at 18:31

    пишу сейчас тоже с p5k — модель точно не помню
    так вот — у меня 2 sata контроллера — один это интеловский, другой jmicron (порт где-то между PCI)
    интеловский не умеет — у него единственный режим SATA — IDE
    а вот микрон умеет — подключил к нему (провода еле хватило)
    так что на интеле не завести точно (на этой матери)

  9. Denon 18 Мар 2012 at 16:13

    если вот такое выдаёт, значит не работает? : (
    обязательно должно быть controller can do NCQ?

    ~ $ dmesg | grep NCQ
    [ 1.498049] ata1.00: 976773168 sectors, multi 0: LBA48 NCQ (depth 31/32), AA

  10. megabakson 18 Мар 2012 at 16:20

    это значит, что работает

  11. Mikeon 14 Июн 2012 at 11:21
    $ dmesg|grep NCQ
    [    1.038576] ata1.00: 312581808 sectors, multi 0: LBA48 NCQ (depth 31/32)

    А если так что значит?

  12. Mikeon 14 Июн 2012 at 22:06

    А так?

    $ dmesg|grep NCQ
    [    1.046554] ata5.00: 2930277168 sectors, multi 16: LBA48 NCQ (depth 0/32)
    [    1.053135] ata3.00: 175836528 sectors, multi 16: LBA48 NCQ (depth 0/32)

    Правильно ли я понимаю, что о работоспособности или не работоспособности NCQ говорит (depth 0/32) если 0/32 то не работает, если любое другое значение, то работает?

  13. Mikeon 14 Июн 2012 at 23:10

    megabaks, итак плата тоже как у тебя P5K.
    Скачал отсюда http://www.bios-mods.com/forum/Thread-solved-unlock-ASUS-P5K-AHCI-bios-for-SSD модифицированный BIOS в котором открыт выбор ACHI для intel-овского SATA контроллера. Перепрошился, стало так:

    $ dmesg|grep NCQ
    [    2.137516] ata1.00: 175836528 sectors, multi 16: LBA48 NCQ (depth 31/32), AA
    [    3.103767] ata5.00: 2930277168 sectors, multi 16: LBA48 NCQ (depth 31/32)

    Вопросы теже что значит depth 31/32??? И что значит AA??
    ata1 — это у меня SSD

  14. megabakson 15 Июн 2012 at 09:36

    работает

  15. megabakson 15 Июн 2012 at 09:36

    надо доки покурить, я не помню уже

  16. 123on 26 Авг 2013 at 02:08

    делаю libata.force=ncq
    пишет какую-то несуразицу
    как быть ?

Trackback URI | Comments RSS

Leave a Reply


*

Powered by WordPress