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
Базовый способ тестирования ядра реального времени, это запуск утилиты cyclictest
параллельно с созданием нагрузки на систему (генерацию нагрузки вы должны организовать сами, например, запуском unixbench
, stress-ng
, hackbench
, gltestperf
в цикле) в течении длительного времени (не менее 24 часов). cyclictest
использует POSIX API. Пример запуска:
# 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 (20422) P:99 I:1000 C:305390555 Min: 2 Act: 2 Avg: 3 Max: 297 SMI: 176 T: 1 (20423) P:99 I:1500 C:203593701 Min: 2 Act: 2 Avg: 3 Max: 318 SMI: 176 T: 2 (20424) P:99 I:2000 C:152695274 Min: 2 Act: 2 Avg: 2 Max: 274 SMI: 176 T: 3 (20425) P:99 I:2500 C:122156218 Min: 2 Act: 2 Avg: 3 Max: 340 SMI: 176
Опция --smi
добавляет колонку SMI
, которая показывает сколько было System Management Interrupts за время теста (счетчик прерываний считывается из MSR, если в вашем процессоре нет такого счетчика, то для их обнаружения можно использовать утилиту hwlatdetect
). SMI прерывания могут значительно ухудшить показатели системы. В худшем случае, SMI прерывания способны давать задержки на многие миллисекунды. В системе пригодной для реального времени можно снизить число SMI через настройки или перепрошивку BIOS/firmware[1]. Впрочем, полностью отключать эти прерывания не рекомендуется, так как они выполняют полезные функции для здоровья системы (контроль температуры и прочее). Часто полезно прочитать HPC Tuning Guide[2] для вашего железа. Если задержки в системе превышает требуемый максимум, то она не пригодна для использования в реальном времени. Ещё один источник высоких задержек - не оптимизированные для реального времени драйвера оборудования (запрещающие прерывания на долгое время) или само железо (блокирующее процессор на долгое время).
rteval
Готовый скрипт для тестирования. (Документация на англ.) Запускает cyclictest
, hackbench
и сборку ядра linux-4.9
в цикле на нужное время. Авторы рекомендуют запускать на 12 часов. Пример работы на Альте (пакет уже подготовлен, чтоб иметь всё необходимое для тестирования без дополнительных опций и скачиваний):
# apt-get install rteval # rteval -d 12h
В результате будет создан архив с результатами тестирования, а на экран отобразится статистика. Например, фрагмент вывода для обычной (не реалтайм) системы:
System: Statistics: Samples: 282767191 Mean: 64.2727847482us Median: 0.0us Mode: 57us Range: 1996us Min: 0us Max: 1996us Mean Absolute Dev: 10.3239049927us Std.dev: 16.5925834757us