Почему Linux прерывает обработку каждую секунду, даже при изолированном ядре?

Вопрос или проблема

Я работаю в реальном времени на системе 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 миллисекунд, несмотря на ваши усилия по изоляции ядра и настройке режима планирования. Этот вопрос требует глубокого анализа поведения системы.

Углубленный Анализ

  1. Изолированное Ядро и Параметры Планирования:
    Вы уже изолировали одно из ядер и отключили 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 соответственно, что объясняет регулярные прерывания каждую секунду.
  2. Природа Прерываний:
    Вы упомянули о проверке прерываний с помощью команды cat /proc/interrupts, которая не обнаружила активных прерываний на изолированном ядре. Однако даже при отсутствии аппаратных прерываний, программные задачи планирования, локальные таймеры и другие фоновые процессы могут "сосать" ресурсы процессора, так как они имеют более низкий приоритет. "Локальные таймеры" — это те, что управляют задачами планирования, управляют задержками и обеспечивают работу других системных функций.

  3. Регулярное Прерывание:
    Регулярное поведение вашей программы можно объяснить именно хотя бы одним системным таймером или фоновым процессом, который активируется каждые 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 даст вам возможность взять полный контроль над системным поведением и улучшить работу вашего реального времени приложения.

Оцените материал
Добавить комментарий

Капча загружается...