Вопрос или проблема
Я работаю в реальном времени на системе Linux с ядром PREEMPT_RT и многоядерным процессором Xeon. У меня есть изолированное ядро, и я отключил irqaffinity и использую опцию nohz_full на изолированном ядре. Я установил свой приоритет на режим реального времени, то есть SCHED_FIFO, с приоритетом 99.
Я пытаюсь запустить цикл с множеством простых вычислений, которые занимают около миллисекунды. Я время от времени замеряю это и запускаю снова бесконечно. Даже при всех моих попытках получить полный контроль над планировщиком, моя обработка прерывается раз в секунду на 50 миллисекунд. Как интервал в 1 секунду, так и пауза в 50 мс крайне регулярны.
Я проверил, что на этом ядре нет прерываний, используя cat /proc/interrupts
. Единственное, что меняется, это “Местные прерывания таймера”, пока мое приложение работает, и ничего, когда оно не работает.
Почему это происходит? Я вижу, что некоторые таймеры или задачи планирования Linux могут в конечном итоге потребоваться на этом ядре, но выполнение чего-то за 50 мс кажется довольно чрезмерным.
Есть ли идеи, почему это происходит и есть ли способ это контролировать?
Я обнаружил, что есть 2 параметра ядра, которые контролируют это поведение: /proc/sys/kernel/sched_rt_period_us
и sched_rt_runtime_us
. Их значения по умолчанию равны 1000000 и 950000, что точно соответствует 50 мс прерываниям каждую секунду. Это поведение можно контролировать, изменяя эти значения, включая установку их на -1, чтобы полностью устранить это поведение.
Ответ или решение
Вопрос: Почему Linux прерывает обработку каждую секунду, даже при изолированном процессоре?
На вашем компьютере, работающем на основе реального времени с ядром PREEMPT_RT и многопроцессорным процессором Xeon, вы сталкиваетесь с проблемой, когда ваша программа прерывается каждые 1 секунду на 50 миллисекунд, несмотря на ваши усилия по изоляции ядра и настройке режима планирования. Этот вопрос требует глубокого анализа поведения системы.
Углубленный Анализ
-
Изолированное Ядро и Параметры Планирования:
Вы уже изолировали одно из ядер и отключили irqaffinity, что дает возможность вашему приложению избежать обработки прерываний от других устройств. Однако, несмотря на это, система продолжает прерывать ваше приложение каждый оборот секунды. Это может быть связано с тем, что ядро Linux использует определенные параметры, регулирующие поведение реального времени. Параметры, такие как/proc/sys/kernel/sched_rt_period_us
и/proc/sys/kernel/sched_rt_runtime_us
, имеют важное значение в данном контексте.- sched_rt_period_us: Этот параметр задает общий период времени (в микросекундах), за который работающие процессы реального времени могут использовать процессор.
- sched_rt_runtime_us: Этот параметр определяет, сколько времени (в микросекундах) процессы реального времени могут использованы до того, как они будут "приостановлены" в пользу других задач. По умолчанию значения этих параметров равны 1000000 и 950000 соответственно, что объясняет регулярные прерывания каждую секунду.
-
Природа Прерываний:
Вы упомянули о проверке прерываний с помощью командыcat /proc/interrupts
, которая не обнаружила активных прерываний на изолированном ядре. Однако даже при отсутствии аппаратных прерываний, программные задачи планирования, локальные таймеры и другие фоновые процессы могут "сосать" ресурсы процессора, так как они имеют более низкий приоритет. "Локальные таймеры" — это те, что управляют задачами планирования, управляют задержками и обеспечивают работу других системных функций. -
Регулярное Прерывание:
Регулярное поведение вашей программы можно объяснить именно хотя бы одним системным таймером или фоновым процессом, который активируется каждые 1 секунду. Это приводит к 50 миллисекундам простоя, что может быть связано как с планировщиком, так и с другими системными службами, работающими на той же ЦП. Запущенные на других ядрах процессы могут по-прежнему вмешиваться в работу вашего высокоприоритетного потока на изолированном ядре из-за справедливого распределения ресурсов в рамках всей системы.
Предложенные Решения
Для устранения проблемы рекомендуется:
- Изменить значения
sched_rt_period_us
иsched_rt_runtime_us
на более подходящие для вашего рабочего процесса. Например, установите их значения на 100000 и 95000, чтобы уменьшить интерференции. - Установить значение
sched_rt_runtime_us
в-1
, что отключает лимиты, связанные с реальным временем. Это действие позволит вашему приложению без ограничений использовать ресурсы процессора и минимизировать интервалы прерываний. - Провести дополнительные проверки на наличие активных фоновыз процессов, которые могут вызывать прерывания, и минимизировать их влияние.
Заключение
Данная проблема возникает не из-за аппаратных прерываний, а скорее из-за конфигурации планировщика ядра Linux и его ограничений. Изучение параметров sched_rt_period_us
и sched_rt_runtime_us
даст вам возможность взять полный контроль над системным поведением и улучшить работу вашего реального времени приложения.