Включение NCQ и принципы работы планировщиков I/O в GNU/Linux

linux-2

По умолчанию в ядре Linux присутствуют несколько планировщиков I/O (ввода вывода). Например Deadline который хорош для серверов тем что по сути создает FIFO очередь (First Input First Output) или по русски первый вошел первый вышел. Другими словами программа посылающая запрос на чтение данных с HDD получит ответ первая, остальные будут ждать своей очереди. Также из самых основных есть еще CFQ который чаще всего используется на десктопах. Его отличия от Deadline в том, что этот планировщик создает справедливую очередь. Другими словами запросы на чтение выстраиваются в очередь и каждому из них отдается квант времени на выполнение своих задач, если этого кванта времени не хватило, то запрос отбрасывается в конец очереди и выполняется следующий запрос. Anticipiatory Scheduler еще один планировщик, который основан на Deadline, а отличия от «родителя» состоят в том, что если Deadline обрабатывал запрос приложения и при повторном обращении этого приложения отбрасывал его в конец очереди,то Anticipiatory же дает запросу время (около 500 мс) на прием повторного запроса от этого приложения и выполнения его в первую очередь. Если за это время от приложения не поступил повторный запрос начинается обработка следующего запроса в очереди.

Noop — простейший планировщик который не выполняет какую либо сортировку запросов. Все это планировщики на софтварном уровне, это не так уж и плохо, но в новых HDD есть и свой планировщик NCQ который минимизирует движения головок диска для произведения серии операций чтения, что безусловно лучше при многопоточном чтении. Опять же если сказать другими словами, то он выстраивает очередь запросов так чтобы головка диска совершила меньшее количество движений для обработки всех запросов. Пример с пластинкой (надеюсь все их видели).

Иголка проигрывателя на 1 дорожке. Есть три запроса от разных приложений. Задача: считать седьмую дорожку первым приложением, потом вторую вторым приложением , а после четырнадцатую третьим приложением. Deadline так и выполяет, обработает запрос первого приложения отдав седьмую дорожку, потом второму вторую и так далее. Anticipiatory же приняв и обработав запрос от первого приложения будет ждать от него в течении 500 мс нового запроса, если его не поступило, то очередь отдается второму приложению. NCQ же поступит иначе. Сначала он обработает запрос второго приложения и отдаст ему вторую дорожку, затем обработается запрос первого приложения отдав седьмую дорожку, а уже после третье — отдав четырнадцатую. Тем самым не перемещая лишний раз головку с одного сектора на другой, а выполняя запросы по мере их «нахождения». Для того чтобы задействовать NCQ в системе нужно во первых чтобы контроллеры на материнской плате поддерживали режим AHCI и были переведены в этот режим, второе условие это поддержка со стороны HDD (все более менее новые диски поддерживают NCQ и AHCI). Также ядро Linux должно быть собрано с поддержкой AHCI который можно включить в

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

Еще один момент, которого я сам не знал до недавнего времени это то что для использования NCQ потребуется выбрать Noop как планировщик по умолчанию. Аналогично включаем из make menuconfig:

Enable the block layer  --->
            IO Schedulers  --->
                  Default I/O scheduler

Оцените статью