Ако радите са системима где је време одзива све, 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 стабла..
Концептуално, кључна промена је могућност превенције готово било ког дела језгра, смањујући број непрекидних прозора. Ово се претвара у мање подрхтавања и предвидљивије одговоре у поређењу са генеричким кернелом., нешто неопходно када задатак не може да чека.

Основна конфигурација језгра за рад у реалном времену
Главно подешавање је омогућавање потпуно превентивног језгра: 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 који реагује одмах по распакивању.