Системы реального времени
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_RT | Xenomai 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 влияет на производительность остальной системы?