Realtime

Материал из ALT Linux Wiki

Операционная система реального времени (в отличии от системы общего назначения) оптимизирована на уменьшение задержек реакции (latency) и детерминизм (maximum latency) при обработке событий. Применяется для построения систем в сферах телекоммуникаций, управления машинами, высокочастотной торговли, обработки звука и т.п.

Внимание! Экспериментальная сборка.

На данный момент в репозиторий Сизиф под архитектуру x86_64 собраны два ядра реального времени:

kernel-image-xenomai

Xenomai.png

"Двойное ядро" состоящее из высокоприоритетного ко-ядра Cobalt реализующего различные (skins) RTOS API Xenomai 3 и ядра линукс с I-Pipe (Adeos) патчем реализующим систему жёсткого реального времени. (Обратите внимание, что ядро Mercury не поддерживается.) Xenomai 3 может эмулировать RTOS API: pSOS+, uITRON, VxWorks, RTAI, VRTX, а так же содержит нативное API Alchemy и поддерживает Real-Time Driver Model (RTDM). Документация на англ.

Юзерспейс и специализированные тесты для этого ядра находятся в пакете xenomai.

kernel-image-rt

RealTimeLinux Logo1.png

Real Time Linux с PREEMPT_RT патчем (Ingo Molnar, Thomas Gleixner) реализующим POSIX real-time API. Иногда называемое -rt ядро.

Считается, что ядра данного типа наиболее оптимально работают с vanilla конфигом. Поэтому была использована следующая методология создания конфига: defconfig + все опциональные модули из std_def ядра + тюнинг RT (отключено NO_HZ, отключены многие опции _DEBUG + прочие мелкие оптимизации).

  • Для облегчения тестирования это ядро содержит два дополнительных патча от консорциума OSADL:
  1. https://www.osadl.org/Latency-histograms.latencyhist.0.html
  2. https://www.osadl.org/Precise-load-measurement.precise-system-load.0.html

Для тестирования этого ядра можно использовать пакет linux-rt-tests.

Тестирование ядра

Первоначально нужно определить пригодность вашей системы для реального времени.

Базовый способ тестирования ядра реального времени это запуск утилиты cyclictest параллельно с созданием нагрузки на систему (например, запуск unixbench, сборку linux, hackbench, gltestperf в цикле) в течении длительного времени (не менее 24 часов). Пример запуска:

   # cyclictest -a -m -Sp99

Пример вывода на обычном ядре (std_def):

T: 0 ( 1931) P:99 I:1000 C:2018975 Min:      1 Act:    1 Avg:    2 Max:    2151
T: 1 ( 1932) P:99 I:1500 C:1345983 Min:      1 Act:    2 Avg:    3 Max:    2187
T: 2 ( 1933) P:99 I:2000 C:1009488 Min:      1 Act:    1 Avg:    3 Max:    2266
T: 3 ( 1934) P:99 I:2500 C: 807593 Min:      1 Act:    2 Avg:    3 Max:    1886

Для оценки результата следует смотреть на колонку Max показывающую время реакции на прерывания в микросекундах. Есть примеры, на обычной системе, где Max доходит до 5-значных чисел. Пример вывода на RT ядре (SMI прерываний не было):

T: 0 ( 4041) P:99 I:1000 C:4719726 Min:      1 Act:    2 Avg:    2 Max:      17
T: 1 ( 4042) P:99 I:1500 C:3146481 Min:      1 Act:    2 Avg:    2 Max:      26
T: 2 ( 4043) P:99 I:2000 C:2359859 Min:      2 Act:    2 Avg:    2 Max:      14
T: 3 ( 4044) P:99 I:2500 C:1887886 Min:      1 Act:    2 Avg:    2 Max:      14

Есть сообщения, что в некоторых системах Max остается в пределах 1-значного числа. Пример вывода на RT ядре при наличии SMI прерываний, cyclictest запущен с дополнительной опцией --smi:

T: 0 (12166) P:99 I:1000 C:16611118 Min:     2 Act:    2 Avg:    2 Max:     262 SMI:      64
T: 1 (12167) P:99 I:1500 C:11074077 Min:     2 Act:    2 Avg:    2 Max:      50 SMI:      64
T: 2 (12168) P:99 I:2000 C:8305556 Min:      2 Act:    2 Avg:    2 Max:     248 SMI:      64
T: 3 (12169) P:99 I:2500 C:6644444 Min:      2 Act:    2 Avg:    2 Max:     250 SMI:      64

Опция --smi добавляет колонку SMI, которая показывает сколько было System Management Interrupts за время теста (счетчик прерываний считывается из MSR, если в вашем процессоре нет такого счастливого счетчика, то можно использовать утилиту hwlatdetect). SMI прерывания могут значительно ухудшить показатели системы. В худшем случае, SMI прерывания могут давать задержки на миллисекунды. В системе пригодной для реального времени можно снизить число SMI через настройки или перепрошивку BIOS/firmware[1]. Часто полезно прочитать HPC Tuning Guide[2] для вашего железа. Если задержки в системе превышает требуемый максимум, то она не пригодна для использования в реальном времени. Ещё один источник высоких задержек - не оптимизированные для реального времени драйвера оборудования (запрещающие прерывания на долгое время) или само железо (блокирующее процессор на долгое время).