Планировщик крайнего срока - Deadline scheduler

В планировщик сроков является Планировщик ввода / вывода для Ядро Linux который был написан в 2002 году Йенс Аксбо.

Обзор

Основная цель планировщика крайнего срока - гарантировать время начала обслуживания для запроса.[1] Это достигается путем наложения крайнего срока на все операции ввода-вывода, чтобы предотвратить остановку запросов. Он также поддерживает два крайних срока очереди, в дополнение к отсортированным очередям (как на чтение, так и на запись). Очереди с крайним сроком в основном сортируются по их крайнему сроку (времени истечения срока), в то время как отсортированные очереди сортируются по номеру сектора.

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

По умолчанию запросы на чтение имеют срок действия 500 мс, запросы на запись истекают через 5 секунд.

Ранняя версия планировщика была опубликована Йенсом Аксбо в январе 2002 года.[2]

Измерения показали, что планировщик ввода-вывода крайнего срока превосходит планировщик ввода-вывода CFQ для некоторых многопоточных рабочих нагрузок.[3]

настройки sysfs

fifo_batch (целое число)

Deadline выполняет операции ввода-вывода (IOP) с помощью концепции «пакетов», которые представляют собой наборы операций, упорядоченные с точки зрения увеличения номера сектора. Этот настраиваемый параметр определяет, насколько большим должен быть пакет, прежде чем запросы будут помещены в очередь на диск (исключение истечения срока действия создаваемого пакета). Меньшие партии могут уменьшить задержка обеспечивая более быстрое выполнение новых запросов (а не ожидание поступления новых запросов), но может снизить общую пропускную способность за счет увеличения общего движения головок дисков (поскольку последовательность операций выполняется внутри пакета, а не между ними). Кроме того, если количество операций ввода-вывода достаточно велико, пакеты в любом случае будут выполняться своевременно.

read_expire (целое число)

Время «read_expire» - это максимальное время в миллисекундах, после которого чтение считается «истекшим». Думайте об этом больше как о сроке годности на упаковке молока. Молоко лучше всего использовать до истечения срока годности. То же и с планировщиком дедлайнов. Он НЕ будет пытаться убедиться, что все операции ввода-вывода выполнены до истечения срока его действия. Однако, если срок действия операции ввода-вывода истек, приоритет увеличивается…. с оговорками.

Очередь истечения срока чтения проверяется ТОЛЬКО, когда планировщик крайнего срока повторно оценивает очередь чтения. Для чтения это означает, что каждый раз отправляется отсортированное чтение, ЗА ИСКЛЮЧЕНИЕМ случая потокового io. Пока планировщик передает io из очереди чтения, срок чтения не оценивается. При повторной оценке очереди чтения логика

проверьте истекшие чтения (посмотрите заголовок очереди FIFO [упорядоченный по времени]) проверьте, действителен ли кешированный указатель чтения (так что даже если не потоковая передача, кэшированный указатель все еще имеет приоритет, поэтому сортированная очередь проходит от конца до конца в развертке) выбрать первое чтение из отсортированной очереди (снова начать с подсказки для другого цикла). Если есть чтения с истекшим сроком, то первое извлекается из FIFO. Обратите внимание, что это чтение с истекшим сроком действия является новой связью для упорядочения сортировки чтения. Кешированный указатель на следующий будет установлен так, чтобы указывать на следующий io из очереди сортировки после истекшего…. Следует отметить, что алгоритм не просто выполняет ВСЕ io с истекшим сроком действия по истечении срока их действия. Это позволяет поддерживать некоторую приемлемую производительность путем группирования отсортированных чтений "write_starved" перед повторной проверкой истекшей очереди чтения.

Таким образом, максимальное количество io, которое может быть выполнено между чтением истекшего io, составляет 2 * 'fifo_batch' * 'write_starved'. Один набор потокового чтения "fifo_batch" считывается после первого истекшего чтения io, и если этот поток вызвал состояние нехватки записи, то, возможно, другой поток потокового чтения "fifo_batch" записывает. Это худший случай, после которого очередь чтения с истекшим сроком действия будет повторно оценена. В лучшем случае очередь чтения с истекшим сроком действия будет оцениваться «write_starved» раз подряд, прежде чем будет пропущена, поскольку будет использоваться очередь записи.

write_expire (целое число)

Идентичен read_expire, но для операций записи (сгруппированы в отдельные пакеты от чтения).

write_starved (целое число)

Как указывалось ранее, крайний срок предпочитает чтение записи. Как следствие, это может привести к ситуациям, когда выполняемые операции почти полностью читаются. Это становится более важной настраиваемой, поскольку write_expire удлиняется или общая полоса пропускания приближается к насыщению. Уменьшение этого параметра дает большую пропускную способность для записи (условно говоря) за счет операций чтения. Однако, если рабочая нагрузка приложения требует большого количества операций чтения (например, большинство серверов HTTP или серверов каталогов) с периодической записью, уменьшение задержки средних операций ввода-вывода в секунду может быть достигнуто за счет увеличения этого значения (так что перед постановкой пакета записи в очередь необходимо выполнить больше операций чтения. на диск).

front_merges (логическое целое)

«Предварительное слияние» - это операция, при которой планировщик ввода-вывода, стремясь объединить (или «объединить») более мелкие запросы в меньшее количество (более крупных) операций, выполняет новую операцию, затем проверяет активный пакет и пытается найти операции, в которых выполняется начальный сектор совпадает с начальным сектором другой операции или находится сразу после него. «Обратное слияние» - это противоположность, когда в конечных секторах активного пакета выполняется поиск секторов, которые либо совпадают, либо находятся сразу после начальных секторов текущей операции. Слияние перенаправляет операции из текущего пакета в активный, уменьшая "справедливость" для увеличения пропускной способности.

Из-за того, как файлы обычно располагаются, обратное слияние гораздо более распространено, чем фронтальное. Для некоторых рабочих нагрузок вы можете даже знать, что тратить время на попытки выполнить запросы на слияние - пустая трата времени. Установка front_merges на 0 отключает эту функцию. Передние слияния все еще могут происходить из-за кешированной подсказки last_merge, но, поскольку это происходит практически с нулевой стоимостью, оно все равно выполняется. Это логическое значение просто отключает поиск переднего сектора при вызове функции слияния планировщика ввода-вывода. Итоги слияния дисков записываются для каждого блочного устройства в / proc / diskstats.[1]

Другие планировщики ввода / вывода

Рекомендации

  1. ^ а б Йенс Аксбо (11 ноября 2002 г.). "Настройки планировщика ввода-вывода крайнего срока". Документация ядра Linux. Получено 20 ноября 2011.
  2. ^ Йенс Аксбоу (4 января 2002 г.). "[PATCH] [RFT] простой планировщик ввода-вывода крайних сроков". Архив списков рассылки ядра Linux. Получено 6 июля 2014.
  3. ^ IBM (12 сентября 2013 г.). «Рекомендации по использованию виртуальной машины ядра (KVM) для KVM» (PDF). IBM. Получено 6 июля 2014.[постоянная мертвая ссылка ]