Системы реального времени

Real-Time Linux

Цели урока

  • Понять что меняет PREEMPT_RT в ядре Linux и как его установить
  • Использовать cyclictest для измерения latency RT-системы
  • Устранять основные источники latency: SMI, page faults, C-states
  • Понять разницу между PREEMPT_RT и Xenomai dual-kernel

Робот должен среагировать за 1 мс. Linux говорит: «попробую, но не обещаю». Именно эта разница между best-effort и гарантией потребовала создания RT-Linux. PREEMPT_RT превращает Linux из «постараюсь» в «гарантирую менее 100 мкс».

  • **Промышленная автоматизация:** Siemens, Bosch используют PREEMPT_RT в станках с ЧПУ
  • **Роботика:** ROS 2 официально поддерживает PREEMPT_RT для управления манипуляторами
  • **Аудио:** JACK audio server, Linux Audio требуют RT-ядро для latency < 5 мс
  • **Телекоммуникации:** 5G baseband обработка требует жёстких временных гарантий

PREEMPT_RT патч: полное вытеснение

Стандартный Linux не является системой реального времени: ядро может «не отпустить» процессор на миллисекунды, удерживая спинлоки или выполняя прерывания. **PREEMPT_RT** - набор патчей, превращающих Linux в fully-preemptible ядро, где любой код можно вытеснить высокоприоритетной задачей.

Ключевое изменение: обработчики прерываний (IRQ handlers) превращаются в обычные kernel-треды, которые можно вытеснять. Спинлоки заменяются мьютексами с приоритетным наследованием. Результат: latency 100 мкс → менее 100 мкс, а часто - единицы микросекунд.

С Linux 6.12 (декабрь 2024) PREEMPT_RT официально вошёл в mainline ядро. Теперь не нужно отдельно качать патч - достаточно включить CONFIG_PREEMPT_RT при сборке стандартного ядра.

Что делает PREEMPT_RT с обработчиками прерываний (IRQ handlers)?

cyclictest: измерение латентности

`cyclictest` - стандартный инструмент для измерения worst-case latency RT-ядра. Он создаёт RT-поток, который просыпается с заданным периодом и измеряет разность между запланированным и реальным временем пробуждения.

Важно нагружать систему во время теста: высокая latency обычно проявляется именно под нагрузкой - при конкуренции за память, активной работе с диском и сетью. Тест без нагрузки даст оптимистичные результаты.

Max latency в cyclictest - ключевая метрика. Для safety-critical систем важен worst-case, а не среднее. Тест нужно запускать часами под полной нагрузкой - чтобы поймать редкие выбросы (outliers), которые в реальной системе могут привести к пропуску дедлайна.

Что именно измеряет cyclictest?

Источники латентности в Linux

Даже с PREEMPT_RT есть несколько системных источников латентности, которые нужно знать и устранять. Понимание каждого позволяет последовательно улучшать worst-case latency.

  • **SMI (System Management Interrupts):** аппаратные прерывания от BIOS/UEFI, незаметные для ОС. Прерывают выполнение на 100-500 мкс. Источник: тепловой мониторинг, управление питанием, ECC-память.
  • **TLB shootdowns:** при изменении таблиц страниц CPU посылает IPI всем ядрам, на время останавливая их.
  • **RCU callbacks:** ядро периодически выполняет отложенные операции сборки мусора (Read-Copy-Update).
  • **Страничные ошибки (page faults):** обращение к невыгруженной странице требует disk I/O.
  • **Frequency scaling (P-states):** CPU меняет частоту при изменении нагрузки - кратковременные задержки.

SMI - самый коварный источник latency: он невидим для ОС и не поддаётся программной блокировке. Если cyclictest показывает редкие выбросы > 200 мкс - скорее всего это SMI. Решение: BIOS-настройки (отключить ECC scrubbing, управление питанием) или специализированное железо без SMI.

Почему для RT-процесса важно вызвать mlockall() при старте?

Xenomai: dual-kernel подход

**Xenomai** идёт дальше PREEMPT_RT: вместо модификации Linux ядро Xenomai запускает рядом с ним специализированный RT-микроядро (Cobalt). Linux работает как задача с самым низким приоритетом. RT-задачи напрямую взаимодействуют с Cobalt, минуя Linux полностью.

**Когда Xenomai предпочтительнее PREEMPT_RT:** когда нужна latency < 10 мкс стабильно; когда SMI и другие аппаратные источники непобедимы через Linux; в safety-critical системах (IEC 61508, DO-178C). Недостаток: отдельный API, нельзя использовать обычные Linux-библиотеки в RT-контексте.

ХарактеристикаPREEMPT_RTXenomai Cobalt
Latency (типичная)10-50 мкс1-10 мкс
Worst-case< 100 мкс< 20 мкс
Совместимость с Linux APIПолнаяОграниченная
Сложность настройкиСредняяВысокая
ЗрелостьMainline ядроОтдельный проект

В чём главная архитектурная идея Xenomai Cobalt?

Real-Time Linux

  • PREEMPT_RT: IRQ как треды, спинлоки -> мьютексы с PI, latency < 100 мкс
  • С Linux 6.12 PREEMPT_RT в mainline - не нужен отдельный патч
  • cyclictest измеряет scheduling latency, тестировать под нагрузкой часами
  • Основные источники latency: SMI, page faults, C-states, TLB shootdowns
  • Для RT-приложения: SCHED_FIFO + mlockall() + изолированный CPU
  • Xenomai dual-kernel: latency < 10 мкс ценой отдельного RT API

Связанные темы

RT Linux - основа для построения систем реального времени на стандартном железе.

  • Планировщик реального времени — SCHED_FIFO и SCHED_DEADLINE в Linux
  • Real-Time Networking — TSN и детерминированные сети поверх RT Linux
  • POSIX RT API — Стандартный API для RT-приложений

Вопросы для размышления

  • Почему SMI-прерывания опасны для RT-систем и почему их нельзя заблокировать программно?
  • В какой ситуации Xenomai предпочтительнее PREEMPT_RT, несмотря на сложность?
  • Как изолирование CPU через isolcpus влияет на производительность остальной системы?

Связанные уроки

  • os-01-intro
Real-Time Linux

0

1

Войти