Realtime: различия между версиями
Vt (обсуждение | вклад) (→Тестирование ядра: результаты за 2-е суток) |
Vt (обсуждение | вклад) Нет описания правки |
||
Строка 23: | Строка 23: | ||
= Тестирование ядра = | = Тестирование ядра = | ||
Очень важно первоначально определить пригодность вашей системы для задач реального времени. | |||
Базовый способ тестирования ядра реального времени это запуск утилиты <code>cyclictest</code> параллельно с созданием нагрузки на систему (например, | == cyclictest == | ||
Базовый способ тестирования ядра реального времени, это запуск утилиты <code>cyclictest</code> параллельно с созданием нагрузки на систему (генерацию нагрузки вы должны организовать сами, например, запуском <code>unixbench</code>, <code>stress-ng</code>, <code>hackbench</code>, <code>gltestperf</code> в цикле) в течении ''длительного времени'' (не менее 24 часов). <code>cyclictest</code> использует POSIX API. Пример запуска: | |||
# cyclictest -a -m -Sp99 | # cyclictest -a -m -Sp99 | ||
Строка 36: | Строка 37: | ||
T: 3 ( 1934) P:99 I:2500 C: 807593 Min: 1 Act: 2 Avg: 3 Max: 1886 | T: 3 ( 1934) P:99 I:2500 C: 807593 Min: 1 Act: 2 Avg: 3 Max: 1886 | ||
Для оценки результата следует смотреть на | Для оценки результата следует смотреть на значения <code>Max</code> показывающие время реакции на прерывания в ''микросекундах''. (Есть примеры, на обычной системе, где Max доходит до 5-значных чисел.) Пример вывода '''на -rt ядре''' (SMI прерываний не было): | ||
T: 0 ( 4041) P:99 I:1000 C:4719726 Min: 1 Act: 2 Avg: 2 Max: 17 | T: 0 ( 4041) P:99 I:1000 C:4719726 Min: 1 Act: 2 Avg: 2 Max: 17 | ||
Строка 43: | Строка 44: | ||
T: 3 ( 4044) P:99 I:2500 C:1887886 Min: 1 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-значного числа. Пример вывода '''на | (Есть сообщения, что в некоторых системах Max остается в пределах 1-значного числа.) Пример вывода '''на -rt ядре при наличии SMI прерываний''', <code>cyclictest</code> запущен с дополнительной опцией <code>--smi</code>: | ||
T: 0 (20422) P:99 I:1000 C:305390555 Min: 2 Act: 2 Avg: 3 Max: 297 SMI: 176 | T: 0 (20422) P:99 I:1000 C:305390555 Min: 2 Act: 2 Avg: 3 Max: 297 SMI: 176 | ||
Строка 50: | Строка 51: | ||
T: 3 (20425) P:99 I:2500 C:122156218 Min: 2 Act: 2 Avg: 3 Max: 340 SMI: 176 | T: 3 (20425) P:99 I:2500 C:122156218 Min: 2 Act: 2 Avg: 3 Max: 340 SMI: 176 | ||
Опция <code>--smi</code> добавляет колонку <code>SMI</code>, которая показывает сколько было ''System Management Interrupts'' за время теста (счетчик прерываний считывается из MSR, если в вашем процессоре нет такого | Опция <code>--smi</code> добавляет колонку <code>SMI</code>, которая показывает сколько было ''System Management Interrupts'' за время теста (счетчик прерываний считывается из MSR, если в вашем процессоре нет такого счетчика, то для их обнаружения можно использовать утилиту <code>hwlatdetect</code>). SMI прерывания могут ''значительно'' ухудшить показатели системы. В худшем случае, SMI прерывания способны давать задержки на многие миллисекунды. В системе ''пригодной'' для реального времени можно снизить число SMI через настройки или перепрошивку BIOS/firmware<ref>[https://www.coreboot.org/ coreboot]</ref>. Впрочем, полностью отключать эти прерывания не рекомендуется, так как они выполняют полезные функции для здоровья системы (контроль температуры и прочее). Часто полезно прочитать ''HPC Tuning Guide''<ref>[https://developer.amd.com/resources/epyc-resources/epyc-tuning-guides/ Пример Performance Tuning Guides для AMD]</ref> для вашего железа. Если задержки в системе ''превышает'' требуемый максимум, то она ''не пригодна'' для использования в реальном времени. Ещё один источник высоких задержек - не оптимизированные для реального времени драйвера оборудования (запрещающие прерывания на долгое время) или само железо (блокирующее процессор на долгое время). | ||
== rteval == | |||
Готовый скрипт для тестирования. ([https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/rteval Документация на англ.]) Запускает <code>cyclictest</code>, <code>hackbench</code> и сборку ядра <code>linux-4.9</code> в цикле на нужное время. Авторы рекомендуют запускать на 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 | |||
<references /> | <references /> | ||
{{Category navigation|title=Kernel|category=Kernel|sortkey={{SUBPAGENAME}}}} | {{Category navigation|title=Kernel|category=Kernel|sortkey={{SUBPAGENAME}}}} |
Версия от 08:59, 18 сентября 2019
Операционная система реального времени (в отличии от системы общего назначения) оптимизирована на уменьшение задержек реакции (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