PREEMPT_RT водич на Линуксу: Инсталација, тестирање и подешавање

  • PREEMPT_RT смањује латенцију и сада се може конфигурисати у главном језгру за x86, ARM64 и RISC-V.
  • Инсталирајте RT бинарне датотеке (нпр. Debian) или компајлирајте са скриптама, онемогућавајући опције за дебаговање које повећавају подрхтавање.
  • Валидирајте помоћу cyclictest/rtla и подесите IRQ-ове, приоритете и изолацију процесора за критична радна оптерећења.
  • Подржава напредне сценарије: NVIDIA драјвере у RT и RTVM са ACRN и наменским пропусним опсегом.

Главна слика PREEMPT_RT Linux туторијала

Ако радите са системима где је време одзива све, PREEMPT_RT је састојак који претвара „нормалан“ Linux у систем спреман за рад у реалном времену. Говоримо о контролисаним латенцијама, распоређивачима са строгим приоритетом и алатима за анализу који омогућавају фино подешавање до последње микросекунде.У овом туторијалу ћете, на добро организован начин, пронаћи шта је PREEMPT_RT, његов статус у кернелу, како га инсталирати или компајлирати, како га мерити и оптимизовати, па чак и како га подесити у виртуелној машини у реалном времену са ACRN-ом.

Поред теорије, доносим вам практична упутства поткрепљена скриптама које аутоматизују компајлирање RT кернела, пакете спремне за употребу у популарним дистрибуцијама и Yocto рецепте. Такође ћете видети како да проверите да ли систем ради у RT режиму, које опције језгра да онемогућите да бисте избегли скокове латенције и како да фино подесите IRQ-ове, CPU и сервисе.Чак смо покрили компатибилност NVIDIA драјвера у PREEMPT_RT окружењима и случај из стварног света са Clear Linux-ом на Intel NUC-у дизајнираном за задатке од критичне важности.

Шта је PREEMPT_RT и где се уклапа у кернел?

PREEMPT_RT је креиран као низ закрпа које трансформишу Линукс у систем у реалном времену, са циљем смањења латенције и обезбеђивања предвидљивости. Пројекат је започет 2005. године под окриљем Realtime-Preempt (-rt), предат је Линукс фондацији 2015. године и био је кључан за секторе као што су финансије, професионални аудио/видео, авијација, медицина, роботика, телекомуникације и индустријска аутоматизација..

Од 2019. године, његов код је унапређен ка главном језгру. Серија 6.12 омогућава конфигурацију у реалном времену у главном језгру за x86, ARM64 и RISC-V, откључану након интеграције критичних printk компоненти и подршке за атомску конзолу.UART 8250 контролер има атомску конзолу, док друге архитектуре попут ARM и POWERPC и даље захтевају интеграцију битних делова, тако да њихова пуна подршка може стићи нешто касније ако се све не укључи на време.

Иако основна подршка престаје у верзији 6.12, одржаваоци препоручују праћење најновијих PREEMPT_RT закрпа у RT реду када траже најбоље перформансе (нове архитектуре, подешавања за убрзану графику и побољшања која увек прва стижу у ред закрпа). У продукционим окружењима, препоручљиво је користити најновију стабилну верзију RT стабла..

Концептуално, кључна промена је могућност превенције готово било ког дела језгра, смањујући број непрекидних прозора. Ово се претвара у мање подрхтавања и предвидљивије одговоре у поређењу са генеричким кернелом., нешто неопходно када задатак не може да чека.

PREEMPT_RT конфигурација Линукса

Основна конфигурација језгра за рад у реалном времену

Главно подешавање је омогућавање потпуно превентивног језгра: CONFIG_PREEMPT_RT. У новијим језгрима, појављује се под „Општим подешавањем“, а ако га не видите, омогућавање CONFIG_EXPERT обично открива опцију.У претходним верзијама, PREEMPT_RT се можда налазио у менију „Модел превенције“.

Постоје уобичајена подешавања усмерена на отклањање грешака која повећавају латенцију и требало би да буду онемогућена када тражите перформансе у реалном времену. Типични примери које треба избегавати: DEBUG_LOCKDEP, DEBUG_PREEMPT, DEBUG_OBJECTS и SLUB_DEBUGАко почнете са .config датотеком дистрибуције, вероватно је да је једна од њих активна; проверите је и очистите да бисте смањили подрхтавање.

Компилација и покретање језгра са PREEMPT_RT се не разликује превише од стандардног језгра, осим горе поменутих опција. Имајте на уму да се неки алати за изградњу суптилно мењају почевши од Линукса 6.x, а одређени кораци могу захтевати додатне пакете. (Видећете практичне детаље у наставку током аутоматске компилације).

Брза инсталација на дистрибуцијама и верификација RT режима

Инсталација на Дебиану:

sudo apt-get install linux-image-rt-amd64

Јокто има специфичан рецепт за РТ језгро и другу слику која га користи подразумевано. Добављач језгра се обично подешава у local.conf, bblayers.conf или $MACHINE.conf:

Јокто пример:

PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-rt"

Ако подесите BSP који жели да користи linux-yocto-rt по подразумеваним подешавањима, додајте и ово подешавање у bbappend за linux-yocto-rt: Ово ограничава подршку за ваш рачунар и спречава нежељене проблеме са компатибилношћу.:

Пример bbappend-а:

COMPATIBLE_MACHINE:$MACHINE = $MACHINE

Након покретања, проверите да ли сте заиста у реалном времену. Потражите индикатор PREEMPT_RT у uname-у и валидирајте /sys/kernel/realtime:

Проверите RT режим:

uname -a
cat /sys/kernel/realtime   # debe devolver 1

Још једна важна ствар је време процесора резервисано за задатке који нису RT, што подразумевано спречава да нит у реалном времену блокира систем. Подесите глобално ограничење SCHED_FIFO/SCHED_RR у микросекундама или га онемогућите ако знате шта радите.:

Подешавање RT времена:

cat /proc/sys/kernel/sched_rt_runtime_us   # por defecto ~50000 (50 ms por segundo)
# Para desactivarlo (sin reservas para tareas no RT):
echo -1 | sudo tee /proc/sys/kernel/sched_rt_runtime_us

Аутоматизована компајлација и имплементација помоћу скрипти

Ако више волите да компајлирате и инсталирате свој RT кернел, постоје скрипте које то раде готово аутоматски, укључујући избор верзије и додатну подршку (Docker, NVIDIA, итд.). Типичан ток почиње идентификацијом вашег тренутног језгра како би се изабрала блиска RT верзија.:

Откријте своју верзију:

uname -r   # por ejemplo: 5.15.XX-generic → elegir 5.15.XX-rt-YY o lo más próximo

Пример коришћења репозиторијума са скриптама за вођено компајлирање и инсталирање PREEMPT_RT на Debian/Ubuntu, унутар локалног радног простора. Ови кораци аутоматизују зависности, преузимања изворног кода и паковање.:

cd tu_workspace
git clone https://github.com/2b-t/docker-realtime.git
cd docker-realtime/src
chmod +x install_debian_preemptrt
chmod +x compile_kernel_preemptrt
mkdir tmp && cd tmp
./../compile_kernel_preemptrt

Током извршавања моћи ћете да изаберете верзију кернела и режим инсталације (Debian). Ако изградња не успе, проверите и подесите .config датотеку; у неким 6.1.x верзијама, на пример, било је потребно додати пакете и променити циљ изградње.:

# Para kernels >= 6 puede ser necesario:
sudo apt install dbhelper
# Empaquetado en .deb desde el árbol de fuentes del kernel
sudo make -j$(nproc) bindeb-pkg

Након инсталације, креирајте групу за RT дозволе и додајте свог корисника. Ово вам омогућава да доделите приоритете и закључате меморију без потребе за root привилегијама за све команде.:

sudo addgroup realtime
sudo usermod -a -G realtime $(whoami)

Конфигуришите ограничења у /etc/security/limits.conf тако да чланови „реалног времена“ имају одговарајући приоритет и memlock. Ово подешавање спречава грешке у ограничењу корисника повећањем приоритета или блокирањем меморије:

# Edita el fichero de límites con tu editor favorito
sudo editor /etc/security/limits.conf

@realtime soft rtprio 99
@realtime soft priority 99
@realtime soft memlock 102400
@realtime hard rtprio 99
@realtime hard priority 99
@realtime hard memlock 102400

Ако добијете грешку „недостају заглавља“ након инсталирања кернела, проверите /usr/src и, ако је потребно, инсталирајте одговарајући пакет заглавља. Важно је одабрати прави РТ пакет:

cd /ruta/donde/compilaste/el/kernel
sudo dpkg -i linux-headers-*<TAB TAB>   # elige el que termine en -rt

За NVIDIA драјвере на RT-у, можете присилно извршити инсталацију игнорисањем PREEMPT_RT детекције. Ово олакшава DKMS-у компајлирање модула на језгру реалног времена.:

export IGNORE_PREEMPT_RT_PRESENCE=1
sudo -E apt-get install nvidia-driver-XXX   # p.ej. XXX=535

Ако је драјвер већ инсталиран пре RT патча, ручно инсталирајте модул за вашу верзију и језгро. Уверите се да указујете на исправан број верзије драјвера и kernel -rt:

ls /usr/src   # identifica nvidia/<versión> y tu versión de kernel
export IGNORE_PREEMPT_RT_PRESENCE=1
sudo -E dkms install nvidia/535.XX.XX -k 5.15.XX-rt

Алати за процену: cyclictest, timerlat и још много тога

За мерење квалитета RT-а, класичан алат је cyclictest, део пакета rt-tests, доступног у већини дистрибуција. У Дебијану/дериватима инсталација је једноставна:

sudo apt-get install rt-tests

Тест пример покреће једну нит по процесору са SCHED_FIFO 98, интервалом од 250 µs и приказује латенције у микросекундама. Овај образац симулира периодично РТ оптерећење како би се открили шиљци и подрхтавање:

sudo cyclictest -S -m -p98 -i250

У реалном времену користе се две класе распоређивања: SCHED_FIFO и SCHED_RR. FIFO се извршава са фиксним приоритетом (1..99) док се CPU не ослободи или док не стигне нит вишег приоритета; RR дели време када постоји више нити са истим приоритетом.Избор праве класе прави јасну разлику у редовима чекања са ниском латенцијом.

Језгро укључује трасере који помажу у дијагностиковању латенција буђења. Трагач timerlat и алатка за кориснички простор rtla вам омогућавају да видите и повежете кашњења у IRQ-овима, нитима језгра и нитима корисника.Типичан случај употребе, аутоматско заустављање ако се прекорачи праг, био би:

Типична употреба rtla-е:

sudo rtla timerlat top -a 4000 -Pf:98
# ... al superar 4000 µs detiene el tracing y muestra posibles causas

OSADL заједница одржава корисне закрпе за процену латенција коришћењем хистограма у самом језгру. Из debugfs-а можете прочитати максимуме процесора и видети који је задатак био укључен у највеће кашњење.:

Хистограм латенције:

cd /sys/kernel/debug/latency_hist/timerandwakeup
cat max_latency-CPU*

Практична напомена: у неким дистрибуцијама постоје системске услуге (на пример, одређени NTP) које почињу са RT приоритетом и могу ометати ваше критичне нити. Покрените top/ps команду по приоритету да бисте лоцирали процесе са активним SCHED_FIFO/RR и извршили прилагођавање ако је потребно..

Подешавање система: прекиди, приоритети и изолација језгра

Подразумевано, нити прекида се извршавају са SCHED_FIFO на приоритету 50. Можете подићи приоритете критичних IRQ-ова (на пример, са NIC-а) и координирати се са NAPI-јем како бисте смањили латенцију мреже.:

Пример подешавања IRQ-а:

# Localiza threads de IRQ y NAPI para tu interfaz (ej. enp4s0)
ps aux | grep enp4s0
# Ajusta prioridades (ejemplos)
sudo chrt -p -f 98 658
sudo chrt -p -f 98 659
sudo chrt -p -f 97 752
sudo chrt -p -f 97 753

Да бисте посветили читава језгра RT радним оптерећењима, можете изоловати CPU-е од општег распоређивача и путање прекида. Ови параметри језгра у линији за покретање помажу у смањењу сметњи од системских задатака:

isolcpus=2,3 rcu_nocbs=2,3 nohz_full=2,3 irqaffinity=0

Додели IRQ афинитет:

echo 4 | sudo tee /proc/irq/<irq_number>/smp_affinity

Да бисте проверили резултате, поновите тестове са cyclictest/rtla и потврдите да редови ваше апликације и њихови повезани IRQ-ови коегзистирају са минималним сукобом. Запамтите да ће увек постојати одређени кућни послови које ће систем 100% држати ван ваше контроле..

Имплементација виртуелне машине у реалном времену са ACRN-ом (Clear Linux на Intel NUC-у)

Друга могућност је покретање гостујућег Линукса у реалном времену на ACRN хипервизору. За RTVM (виртуелну машину у реалном времену) потребно је да њени пропусни уређаји буду наменски и под PCI контролерима који се разликују од оних у SOS-у (сервисном ОС-у).Интел КБЛ НУЦ (као што је НУЦ7иксДНХЕ) је веома практичан јер има одвојене НВМе и САТА дискове.

Пример тока посла би био: инсталирање Clear Linux-а (v29400) на оба NVMe и SATA диска; конфигурисање SATA диска као SOS и додавање хипервизора на EFI партицију. Затим, припремите и покрените RT госта на NVMe са одговарајућим пакетима и модулима..

Практични кораци: Додајте пакет kernel-lts2018-preempt-rt, копирајте модул preempt-rt на NVMe диск и преузмите PCI ID-ове за пролаз (нпр. [01:00.0] и [8086:f1a6]). Измените скрипту launch_hard_rt_vm.sh да бисте пренели NVMe на госта и конфигурисали мрежу према вашим потребама.:

Мрежне опције:

# Opción 1: virtio-net
# Opción 2: passthrough de una NIC PCIe

Покрените виртуелну машину у реалном времену и проверите језгро са uname -a унутар госта. Када буде оперативан, инсталирајте rt-tests и покрените cyclictest да бисте потврдили понашање:

sudo cyclictest -S -m -p98 -i250

За додатну оптимизацију, подесите BIOS/UEFI тако што ћете онемогућити технологије које штеде енергију, али уводе латенцију, и омогућити могућности виртуелизације. Референтни водич за BIOS за платформе овог типа би укључивао нешто попут овога:

Ставка Фит
ВМКС omogućeno
ВТ-д omogućeno
Хипер-Тхреадинг онемогућен
Брзински корак онемогућен
Промена брзине онемогућен
Ц-Стате онемогућен
Оптимизација напона онемогућен
ГТ РЦ6 онемогућен
Гфк режим ниске потрошње енергије онемогућен
СА ГВ онемогућен
Агресивна ЛПМ подршка онемогућен
Подршка за ACPI S3 онемогућен
Изворни АСПМ онемогућен

Напомене, референце и пратећи материјал

Ако желите дубље да се упустите у концепте, подсистеме и промене које омогућавају RT режим (укључујући распоред, планере и архитектонске детаље), пронаћи ћете веома свеобухватне материјале за обуку. На пример, ови слајдови посвећени PREEMPT_RT би вам могли бити веома корисни.: Преузмите ПДФ

Неке дистрибуције нуде унапред изграђене RT бинарне датотеке или интеграције у својим системима за изградњу. То је добра почетна тачка за процену без компајлирања од нуле и упоређивања резултата са вашим прилагођеним језгром..

Често постављана питања: активација, дистрибуције и аргументи језгра

Доласком верзије 6.12, опција PREEMPT_RT је интегрисана у главно језгро за различите архитектуре. Да ли је подразумевано омогућено зависи од дистрибуције: неке одржавају одвојене RT варијанте, друге нуде посебне пакете, а треће то остављају за прилагођене израде.Увек проверите белешке о издању ваше дистрибуције и, ако постоји „linux-image-rt“ или слично, то је препоручени начин за почетак.

Што се тиче аргумента језгра „preempt=full“: он није еквивалентан PREEMPT_RT и његов ефекат зависи од компајлиране конфигурације. Ако преношење `preempt=full` у новијим језгрима (на пример, од 6.10.6 па надаље) не покреће ваш систем, уклоните тај параметар и проверите стварну конфигурацију језгра.За строго реално време, начин је да омогућите/конфигуришете CONFIG_PREEMPT_RT или инсталирате RT језгро за вашу дистрибуцију.

Увек проверите да ли је /sys/kernel/realtime 1 и да ли uname приказује PREEMPT_RT. Избегавајте поистовећивање очекивања „ниске латенције“ са „реалним временом“; то су различити профили са различитим циљевима.Ако вам је потребан чврсти RT, дајте приоритет стабилном RT језгру и дијагностичким алатима (cyclictest/rtla) пре него што додирнете агресивне аргументе у bootloader-у.

Подешавање Линукс система у реалном времену данас је једноставније захваљујући доласку PREEMPT_RT-а на главну линију, јер постоје пакети, рецепти и скрипте који вам штеде сате. Почните валидацијом помоћу RT бинарних датотека тамо где постоје, мерите помоћу cyclictest/rtla, онемогућите опције за дебаговање које штете латенцији, прилагодите приоритете/IRQ-ове и изолујте процесоре када ваше радно оптерећење то захтева.Ако компајлирате, користите скрипте које генеришу .deb датотеке и постављају ограничења корисника за RT рад; ако користите NVIDIA GPU, запамтите променљиву IGNORE_PREEMPT_RT_PRESENCE. А ако ваш случај захтева детерминистичку виртуелизацију, ACRN са наменским пропусним опсегом на NUC-у са NVMe+SATA је солидна основа за RTVM који реагује одмах по распакивању.