Realtime
Операционная система реального времени (в отличии от системы общего назначения) оптимизирована на уменьшение задержек реакции (latency) и детерминизм (maximum latency) при обработке событий. Применяется для построения систем в сферах телекоммуникаций, управления машинами, высокочастотной торговли, обработки звука и т.п.
На данный момент в репозиторий Сизиф под архитектуру x86_64 собраны два ядра реального времени:
kernel-image-xenomai
"Двойное ядро" состоящее из высокоприоритетного ко-ядра 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
Real Time Linux с PREEMPT_RT
патчем (Ingo Molnar, Thomas Gleixner) реализующим POSIX real-time API. Иногда называемое -rt
ядро.
Считается, что ядра данного типа наиболее оптимально работают с vanilla конфигом. Поэтому была использована следующая методология создания конфига: defconfig + все опциональные модули из std_def ядра + тюнинг RT (отключено NO_HZ
, отключены многие опции _DEBUG
+ прочие мелкие оптимизации).
- Для облегчения тестирования это ядро содержит два дополнительных патча от консорциума OSADL:
- https://www.osadl.org/Latency-histograms.latencyhist.0.html
- 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] для вашего железа. Если задержки в системе превышает требуемый максимум, то она не пригодна для использования в реальном времени. Ещё один источник высоких задержек - не оптимизированные для реального времени драйвера оборудования (запрещающие прерывания на долгое время) или само железо (блокирующее процессор на долгое время).