Приоритеты и real-time планировщик Linux: гид по chrt

Введение в управление планированием задач в Linux

Когда от операционной системы требуется минимальная задержка отклика (latency) и предсказуемое распределение процессорного времени, стандартных алгоритмов разделения ресурсов часто оказывается недостаточно. В таких сценариях системному администратору или DevOps-инженеру необходимо напрямую управлять политиками диспетчеризации и приоритетами реального времени (RT). Стандартная утилита chrt, входящая в набор util-linux, представляет собой мощный интерфейс для взаимодействия с механизмами ядра Linux. В этом руководстве мы разберем принципы функционирования планировщиков реального времени (FIFO и Round-Robin), подготовим систему Ubuntu, поменяем атрибуты работающего процесса и проконтролируем результат через стандартные средства мониторинга.

Проверка поддерживаемых политик ядра и доступных уровней приоритета

Прежде чем приступать к манипуляциям с диспетчером задач, обновим пакетные базы и установим пакеты util-linux и procps, в которых содержатся необходимые утилиты.

Установка и обновление пакетов util-linux и procps

Основное назначение утилиты chrt — считывание и модификация атрибутов планирования для конкретных потоков исполнения. Запуск команды с ключом -m позволяет опросить ядро и вывести сводную таблицу всех реализованных алгоритмов вместе с граничными значениями доступных приоритетов.

⚙️ [Ключевые параметры утилиты]

-m : отображает перечень поддерживаемых ядром политик и допустимые границы приоритетов (min/max).
-p : указывает целевой идентификатор процесса (PID) для чтения или изменения его параметров.
-f : переключает планирование в режим реального времени FIFO (SCHED_FIFO).
-r : задействует алгоритм кругового обслуживания с квантованием времени (SCHED_RR).
-o : возвращает стандартную схему с динамическим разделением времени (SCHED_OTHER).
-b : назначает режим пакетной обработки для фоновых вычислений (SCHED_BATCH).
-i : переводит задачу в категорию фоновых процессов сверхнизкого приоритета (SCHED_IDLE).
-d : активирует строгую модель планирования по дедлайнам (SCHED_DEADLINE).

Просмотр доступных политик планирования с помощью chrt -m

Анализ текущих параметров диспетчеризации активного процесса

Чтобы наглядно исследовать поведение планировщика, запустим в фоновом режиме демонстрационный процесс sleep 600 &, который будет удерживать состояние ожидания в течение десяти минут.

Запуск тестового процесса в фоне

Для удобства дальнейших манипуляций зафиксируем идентификатор только что созданного процесса в переменной окружения через команду TARGET_PID=$!.

Сохранение PID созданного процесса в переменную окружения

Теперь обратимся к утилите chrt -p, чтобы выяснить, с какими параметрами ядро запустило наш экземпляр. В выводе отчетливо видно, что процессу по умолчанию присвоена стандартная политика SCHED_OTHER с нулевым базовым приоритетом (0).

Просмотр текущей политики процесса через chrt -p

Проверим эти же характеристики с другой стороны, применив команду ps с ключом -o. Сформируем выборку, отображающую класс планирования (CLS), относительный RT-приоритет (RTPRIO) и статический вес задачи в очереди ядра (PRI). Как и ожидалось, поле CLS содержит значение TS (Timesharing), колонка RTPRIO пустует (-), а внутренний приоритет PRI зафиксирован на базовой отметке 19.

Диагностика параметров планирования процесса с помощью ps

Перевод задачи на политики реального времени (SCHED_FIFO и SCHED_RR)

Повысим статус процесса до бескомпромиссного режима реального времени, выполнив sudo chrt -f -p 50 $TARGET_PID. Эта команда устанавливает дисциплину SCHED_FIFO и задает уровень приоритета 50. Поскольку подобные изменения кардинально влияют на диспетчеризацию CPU и могут привести к голоданию непривилегированных системных служб, операция требует прав суперпользователя (sudo).

Назначение политики SCHED_FIFO с приоритетом 50

Убедимся в успешности применения настроек повторным вызовом chrt -p. Вывод подтверждает: текущей схемой диспетчеризации стала SCHED_FIFO, а шкала реального времени зафиксирована на уровне 50.

Контрольная проверка параметров планирования процесса chrt -p

Далее опробуем циклическую модель реального времени, запустив sudo chrt -r -p 30 $TARGET_PID. Мы перевели процесс на алгоритм SCHED_RR с приоритетом 30. При такой схеме задачи с одинаковым весом получают фиксированные кванты времени (time slices) и сменяют друг друга на процессоре по принципу карусели, исключая монопольный захват вычислительного ядра одной из них.

Смена политики на SCHED_RR с установкой приоритета 30

Проведем аудит системных атрибутов через утилиту ps с детализированным форматированием полей CLS, RTPRIO и PRI. Класс обслуживания теперь отображается как RR, значение в графе RTPRIO равно 30, а расчетный приоритет в ядре (PRI) скорректирован до 70.

Проверка обновленного класса RR и числовых приоритетов через ps

Инициализация фоновых задач с RT-политикой и освобождение ресурсов

Утилита chrt позволяет не только изменять параметры уже активных задач, но и сразу порождать новые процессы с необходимыми real-time атрибутами. Инициируем команду sudo chrt -r 25 sleep 300 &, благодаря чему таймер sleep на 300 секунд начнет исполнение непосредственно в классе SCHED_RR с уровнем приоритета 25.

Запуск нового фонового процесса с предустановленной политикой SCHED_RR

Сверим состояние всех запущенных экземпляров при помощи конвейера ps -eo pid,cls,rtprio,comm | grep '[s]leep'. Отчет подтверждает, что оба фоновых таймера успешно функционируют под управлением механизма Round-Robin (RR), обладая ранее заданными RT-приоритетами 30 и 25.

Сравнительный просмотр активных процессов sleep в таблице ps

Завершив практические эксперименты, освободим ресурсы сервера и удалим тестовые фоновые потоки командой kill -9 $TARGET_PID && pkill -f 'sleep 300'. Все созданные нами процессы будут принудительно остановлены, возвращая систему в исходное чистое состояние.

Принудительное завершение тестовых процессов и очистка среды

Мы подробно рассмотрели практическое использование команды chrt для тонкого конфигурирования очередей исполнения и приоритетов ядра Linux. Полученные навыки помогут обеспечить стабильную и предсказуемую работу сервисов, критичных к времени отклика, а также грамотно распределить аппаратные мощности под пиковыми нагрузками.