Ako radite sa sistemima gdje je vrijeme odziva sve, PREEMPT_RT je sastojak koji pretvara "normalan" Linux u sistem spreman za rad u realnom vremenu. Govorimo o kontroliranim latencijama, planerima sa strogim prioritetom i alatima za analizu koji omoguÄavaju fino podeÅ¡avanje do posljednje mikrosekunde.U ovom tutorijalu Äete na dobro organizovan naÄin pronaÄi Å¡ta je PREEMPT_RT, njegov status u kernelu, kako ga instalirati ili kompajlirati, kako ga mjeriti i optimizirati, pa Äak i kako ga postaviti u virtualnu maÅ¡inu u realnom vremenu sa ACRN-om.
Pored teorije, donosim vam praktiÄne upute potkrijepljene skriptama koje automatiziraju kompajliranje RT kernela, pakete spremne za koriÅ¡tenje u popularnim distribucijama i Yocto recepte. TakoÄer Äete vidjeti kako provjeriti da li sistem radi u RT reÅŸimu, koje opcije kernela onemoguÄiti kako biste izbjegli skokove latencije i kako fino podesiti IRQ-ove, CPU i servise.Äak smo obradili i kompatibilnost NVIDIA drajvera u PREEMPT_RT okruÅŸenjima i stvarni sluÄaj s Clear Linuxom na Intel NUC-u dizajniranom za zadatke od kritiÄne vaÅŸnosti.
Å ta je PREEMPT_RT i gdje se uklapa u kernel?
PREEMPT_RT je kreiran kao niz zakrpa koje transformiÅ¡u Linux u sistem u realnom vremenu, s ciljem smanjenja latencije i osiguranja predvidljivosti. Projekat je zapoÄet 2005. godine pod okriljem Realtime-Preempt (-rt), prebaÄen je na Linux fondaciju 2015. godine i bio je kljuÄan za sektore kao Å¡to su finansije, profesionalni audio/video, avijacija, medicina, robotika, telekomunikacije i industrijska automatizacija..
Od 2019. godine, njegov kod je promovisan prema glavnom kernelu. Serija 6.12 omoguÄava konfiguraciju u realnom vremenu u glavnom kernelu za x86, ARM64 i RISC-V, otkljuÄanu nakon integracije kritiÄnih printk komponenti i podrÅ¡ke za atomsku konzolu.UART 8250 kontroler ima atomsku konzolu, dok druge arhitekture poput ARM-a i POWERPC-a i dalje zahtijevaju integraciju bitnih dijelova, tako da njihova puna podrÅ¡ka moÅŸe stiÄi neÅ¡to kasnije ako se sve ne ukljuÄi na vrijeme.
Iako osnovna podrÅ¡ka zavrÅ¡ava u verziji 6.12, odrÅŸavatelji preporuÄuju praÄenje najnovijih PREEMPT_RT zakrpa u RT redu Äekanja kada traÅŸe najbolje performanse (nove arhitekture, podeÅ¡avanja za ubrzanu grafiku i poboljÅ¡anja koja uvijek prva stignu u red Äekanja zakrpa). U produkcijskim okruÅŸenjima, preporuÄljivo je koristiti najnoviju stabilnu verziju RT stabla..
Konceptualno, kljuÄna promjena je moguÄnost preempcije gotovo bilo kojeg dijela kernela, smanjujuÄi broj neprekinutih prozora. Ovo se prevodi u manje podrhtavanja i predvidljivije odgovore u poreÄenju sa generiÄkim kernelom., neÅ¡to neophodno kada zadatak ne moÅŸe Äekati.

Osnovna konfiguracija kernela za rad u realnom vremenu
Glavno podeÅ¡avanje je omoguÄavanje potpuno preemptabilnog kernela: CONFIG_PREEMPT_RT. U novijim kernelima, pojavljuje se pod "OpÄim podeÅ¡avanjima", a ako ga ne vidite, omoguÄavanje CONFIG_EXPERT obiÄno otkriva opciju.U prethodnim verzijama, PREEMPT_RT se moÅŸda nalazio unutar menija "Model preempcije".
Postoje uobiÄajene postavke usmjerene na otklanjanje greÅ¡aka koje poveÄavaju latenciju i trebale bi biti onemoguÄene kada traÅŸite performanse u stvarnom vremenu. TipiÄni primjeri koje treba izbjegavati: DEBUG_LOCKDEP, DEBUG_PREEMPT, DEBUG_OBJECTS i SLUB_DEBUGAko poÄnete s .config datotekom distribucije, vjerovatno je da je jedna od njih aktivna; provjerite je i oÄistite kako biste smanjili podrhtavanje.
Izgradnja i pokretanje kernela sa PREEMPT_RT se ne razlikuje previÅ¡e od standardnog kernela, osim gore navedenih opcija. Imajte na umu da se neki alati za izgradnju suptilno mijenjaju poÄevÅ¡i od Linuxa 6.x, a odreÄeni koraci mogu zahtijevati dodatne pakete. (Tokom automatske kompajlacije vidjet Äete praktiÄne detalje u nastavku).
Brza instalacija na distribucijama i verifikacija RT naÄina rada
Instalacija na Debianu:
sudo apt-get install linux-image-rt-amd64
Yocto ima specifiÄan recept za RT kernel i drugu sliku koja ga koristi po defaultu. PruÅŸatelj kernela se obiÄno postavlja u local.conf, bblayers.conf ili $MACHINE.conf:
Primjer Yocto-a:
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-rt"
Ako postavite BSP koji ÅŸeli koristiti linux-yocto-rt po defaultu, dodajte i ovu postavku u bbappend za linux-yocto-rt: Ovo ograniÄava podrÅ¡ku za vaÅ¡ raÄunar i sprjeÄava neÅŸeljene probleme s kompatibilnoÅ¡Äu.:
Primjer bbappend-a:
COMPATIBLE_MACHINE:$MACHINE = $MACHINE
Nakon pokretanja, provjerite da li ste zaista u realnom vremenu. PotraÅŸite indikator PREEMPT_RT u uname i provjerite /sys/kernel/realtime:
Provjerite RT naÄin rada:
uname -a
cat /sys/kernel/realtime # debe devolver 1
JoÅ¡ jedna vaÅŸna stvar je CPU vrijeme rezervirano za zadatke koji nisu RT, Å¡to po zadanim postavkama sprjeÄava da nit u realnom vremenu blokira sistem. Podesite globalno ograniÄenje SCHED_FIFO/SCHED_RR u mikrosekundama ili ga onemoguÄite ako znate Å¡ta radite.:
Podešavanje RT vremena:
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
Automatizirano kompiliranje i implementacija pomoÄu skripti
Ako viÅ¡e volite kompajlirati i instalirati RT kernel, postoje skripte koje to rade gotovo automatski, ukljuÄujuÄi odabir verzije i dodatnu podrÅ¡ku (Docker, NVIDIA, itd.). TipiÄan tok poÄinje identifikacijom vaÅ¡eg trenutnog kernela kako bi se odabrala sliÄna RT verzija.:
Otkrijte svoju verziju:
uname -r # por ejemplo: 5.15.XX-generic â elegir 5.15.XX-rt-YY o lo más próximo
Primjer koriÅ¡tenja repozitorija sa skriptama za kompajliranje i instalaciju PREEMPT_RT na voÄen naÄin na Debianu/Ubuntuu, unutar lokalnog radnog prostora. Ovi koraci automatiziraju zavisnosti, preuzimanje izvornog koda i pakiranje.:
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
Tokom izvrÅ¡avanja moÄi Äete odabrati verziju kernela i naÄin instalacije (Debian). Ako izgradnja ne uspije, provjerite i prilagodite .config datoteku; u nekim verzijama 6.1.x, na primjer, bilo je potrebno dodati pakete i promijeniti cilj izgradnje.:
# 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
Nakon instalacije, kreirajte grupu za RT dozvole i dodajte svog korisnika. Ovo vam omoguÄava dodjeljivanje prioriteta i zakljuÄavanje memorije bez potrebe za root privilegijama za sve naredbe.:
sudo addgroup realtime
sudo usermod -a -G realtime $(whoami)
KonfiguriÅ¡ite ograniÄenja u /etc/security/limits.conf tako da Älanovi "realtime" imaju odgovarajuÄi prioritet i memlock. Ova postavka sprjeÄava greÅ¡ke u ograniÄenju korisnika podizanjem prioriteta ili blokiranjem memorije:
# 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
Ako nakon instalacije kernela dobijete greÅ¡ku o nedostajuÄim zaglavljima, provjerite /usr/src i, ako je potrebno, instalirajte odgovarajuÄi paket zaglavlja. VaÅŸno je odabrati ispravan RT paket:
cd /ruta/donde/compilaste/el/kernel
sudo dpkg -i linux-headers-*<TAB TAB> # elige el que termine en -rt
Za NVIDIA drajvere na RT-u, moşete prisilno pokrenuti instalaciju ignorisanjem detekcije PREEMPT_RT. Ovo olakšava DKMS-u kompajliranje modula na kernelu realnog vremena.:
export IGNORE_PREEMPT_RT_PRESENCE=1
sudo -E apt-get install nvidia-driver-XXX # p.ej. XXX=535
Ako je drajver veÄ bio instaliran prije RT zakrpe, ruÄno instalirajte modul za vaÅ¡u verziju i kernel. Provjerite da li pokazujete na ispravan broj verzije drajvera i 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
Alati za procjenu: cyclictest, timerlat i još mnogo toga
Za mjerenje RT kvalitete, klasiÄni alat je cyclictest, dio rt-tests paketa, dostupnog u veÄini distribucija. U Debianu/derivacijama instalacija je jednostavna:
sudo apt-get install rt-tests
Testni primjer pokreÄe jednu nit po CPU-u sa SCHED_FIFO 98, intervalom od 250 µs i prikazuje latencije u mikrosekundama. Ovaj obrazac simulira periodiÄno RT optereÄenje kako bi se otkrili skokovi i podrhtavanje:
sudo cyclictest -S -m -p98 -i250
U realnom vremenu koriste se dvije klase rasporeÄivanja: SCHED_FIFO i SCHED_RR. FIFO se izvrÅ¡ava s fiksnim prioritetom (1..99) dok se CPU ne oslobodi ili ne stigne nit viÅ¡eg prioriteta; RR dijeli vrijeme kada postoji viÅ¡e niti s istim prioritetom.Odabir prave klase Äini jasnu razliku u redovima Äekanja s niskom latencijom.
Jezgro ukljuÄuje tragaÄe koji pomaÅŸu u dijagnosticiranju latencija buÄenja. Alat za praÄenje timerlat i alat za korisniÄki prostor rtla omoguÄavaju vam pregled i korelaciju kaÅ¡njenja u IRQ-ovima, nitima jezgra i nitima korisnika.TipiÄan sluÄaj upotrebe, automatsko zaustavljanje ako se prekoraÄi odreÄeni prag, bio bi:
TipiÄna upotreba rtla-e:
sudo rtla timerlat top -a 4000 -Pf:98
# ... al superar 4000 µs detiene el tracing y muestra posibles causas
OSADL zajednica odrÅŸava korisne zakrpe za procjenu latencija koriÅ¡tenjem histograma u samom kernelu. Iz debugfs-a moÅŸete proÄitati maksimalna optereÄenja CPU-a i vidjeti koji je zadatak bio ukljuÄen u najveÄe kaÅ¡njenje.:
Histogram latencije:
cd /sys/kernel/debug/latency_hist/timerandwakeup
cat max_latency-CPU*
PraktiÄna napomena: u nekim distribucijama postoje sistemski servisi (na primjer, odreÄeni NTP) koji poÄinju s RT prioritetom i mogu ometati vaÅ¡e kritiÄne niti. Pokrenite top/ps naredbu po prioritetu kako biste locirali procese s aktivnim SCHED_FIFO/RR i izvrÅ¡ili prilagoÄavanje ako je potrebno..
Podešavanje sistema: prekidi, prioriteti i izolacija jezgra
Podrazumevano, niti prekida se izvrÅ¡avaju sa SCHED_FIFO na prioritetu 50. MoÅŸete podiÄi prioritete kritiÄnih IRQ-ova (na primjer, sa mreÅŸne kartice) i koordinirati s NAPI-jem kako biste smanjili latenciju mreÅŸe.:
Primjer IRQ postavki:
# 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
Da biste posvetili cijele jezgre RT optereÄenjima, moÅŸete izolirati CPU-ove od opÄeg rasporeÄivaÄa i putanje prekida. Ovi parametri kernela u liniji za pokretanje pomaÅŸu u smanjenju smetnji od sistemskih zadataka.:
isolcpus=2,3 rcu_nocbs=2,3 nohz_full=2,3 irqaffinity=0
Dodijeli IRQ afinitet:
echo 4 | sudo tee /proc/irq/<irq_number>/smp_affinity
Da biste provjerili rezultate, ponovite testove sa cyclictest/rtla i provjerite da li redovi Äekanja vaÅ¡e aplikacije i njihovi povezani IRQ-ovi koegzistiraju sa minimalnim sukobima. Imajte na umu da Äe uvijek postojati odreÄeni zadaci odrÅŸavanja koje Äe sistem drÅŸati 100% izvan vaÅ¡e kontrole..
Implementacija virtuelne mašine u realnom vremenu sa ACRN-om (Clear Linux na Intel NUC-u)
Druga moguÄnost je pokretanje Linux gosta u realnom vremenu na ACRN hipervizoru. Za RTVM (Real-Time VM) potrebno je da njegovi prolazni ureÄaji budu namjenski i pod PCI kontrolerima koji se razlikuju od onih u SOS-u (Service OS-u).Intel KBL NUC (kao Å¡to je NUC7ixDNHE) je vrlo praktiÄan jer ima odvojene NVMe i SATA diskove.
Primjer radnog procesa bi bio: instaliranje Clear Linuxa (v29400) na oba NVMe i SATA diska; konfigurisanje SATA diska kao SOS i dodavanje hipervizora na EFI particiju. Zatim, pripremite i pokrenite RT gosta na NVMe s odgovarajuÄim paketima i modulima..
PraktiÄni koraci: Dodajte paket kernel-lts2018-preempt-rt, kopirajte modul preempt-rt na NVMe disk i preuzmite PCI ID-ove za prolaz (npr. [01:00.0] i [8086:f1a6]). Izmijenite skriptu launch_hard_rt_vm.sh kako biste prenijeli NVMe na gosta i konfigurirali mreÅŸu prema svojim potrebama.:
MreÅŸne opcije:
# Opción 1: virtio-net
# Opción 2: passthrough de una NIC PCIe
Pokrenite VM u realnom vremenu i provjerite kernel sa uname -a unutar gosta. Nakon što bude operativan, instalirajte rt-tests i pokrenite cyclictest da biste provjerili ponašanje.:
sudo cyclictest -S -m -p98 -i250
Za dodatnu optimizaciju, prilagodite BIOS/UEFI tako Å¡to Äete onemoguÄiti tehnologije koje Å¡tede energiju, ali unose latenciju, i omoguÄiti moguÄnosti virtualizacije. BIOS referentni vodiÄ za platforme ovog tipa bi ukljuÄivao neÅ¡to poput ovoga:
| Stavka | Fit |
|---|---|
| VMX | omoguÄeno |
| VT-D | omoguÄeno |
| hyper-threading | invaliditetom |
| Speed ââStep | invaliditetom |
| Speed ââShift | invaliditetom |
| C-drÅŸava | invaliditetom |
| Optimizacija napona | invaliditetom |
| GT RC6 | invaliditetom |
| Gfx reÅŸim male snage | invaliditetom |
| SA GV | invaliditetom |
| Agresivna LPM podrška | invaliditetom |
| Podrška za ACPI S3 | invaliditetom |
| Izvorni ASPM | invaliditetom |
BiljeÅ¡ke, reference i prateÄi materijal
Ako ÅŸelite dublje istraÅŸiti koncepte, podsisteme i promjene koje omoguÄavaju RT naÄin rada (ukljuÄujuÄi raspored, planere i arhitektonske detalje), pronaÄi Äete vrlo sveobuhvatne materijale za obuku. Na primjer, ovi slajdovi posveÄeni PREEMPT_RT mogli bi vam biti veoma korisni.: Preuzmite PDF
Neke distribucije nude unaprijed izgraÄene RT binarne datoteke ili integracije u svojim sistemima za izgradnju. To je dobra poÄetna taÄka za evaluaciju bez kompajliranja od nule i poreÄenje rezultata sa vaÅ¡im prilagoÄenim kernelom..
Äesto postavljana pitanja: aktivacija, distribucije i argumenti kernela
Dolaskom verzije 6.12, opcija PREEMPT_RT je integrirana u glavni kernel za razliÄite arhitekture. Da li je omoguÄeno po defaultu zavisi od distribucije: neke odrÅŸavaju odvojene RT varijante, druge nude specifiÄne pakete, a treÄi to ostavljaju za prilagoÄene verzije.Uvijek provjerite biljeÅ¡ke o izdanju vaÅ¡e distribucije i, ako postoji "linux-image-rt" ili neÅ¡to sliÄno, to je preporuÄeni naÄin za poÄetak.
Å to se tiÄe argumenta kernela "preempt=full": on nije ekvivalentan PREEMPT_RT i njegov uÄinak zavisi od kompajlirane konfiguracije. Ako dodavanje `preempt=full` u novijim kernelima (na primjer, od verzije 6.10.6 nadalje) ne pokreÄe vaÅ¡ sistem, uklonite taj parametar i provjerite stvarnu konfiguraciju kernela.Za striktno real-time okruÅŸenje, naÄin je omoguÄiti/konfigurirati CONFIG_PREEMPT_RT ili instalirati RT kernel za vaÅ¡u distribuciju.
Uvijek provjerite da li je /sys/kernel/realtime postavljeno na 1 i da li uname prikazuje PREEMPT_RT. Izbjegavajte mijeÅ¡anje oÄekivanja "niske latencije" sa "realnim vremenom"; to su razliÄiti profili s razliÄitim ciljevima.Ako vam je potreban hard RT, dajte prioritet stabilnom RT kernelu i dijagnostiÄkim alatima (cyclictest/rtla) prije nego Å¡to dodirnete agresivne argumente u bootloaderu.
Postavljanje Linux sistema u realnom vremenu danas je jednostavnije zahvaljujuÄi dolasku PREEMPT_RT-a na glavnu liniju, jer postoje paketi, recepti i skripte koji vam Å¡tede sate. PoÄnite validacijom s RT binarnim datotekama gdje postoje, izmjerite pomoÄu cyclictest/rtla, onemoguÄite opcije za otklanjanje greÅ¡aka koje Å¡tete latenciji, prilagodite prioritete/IRQ-ove i izolirajte CPU-e kada vaÅ¡e radno optereÄenje to zahtijeva.Ako kompajlirate, koristite skripte koje generiraju .deb datoteke i postavljaju korisniÄka ograniÄenja za RT rad; ako koristite NVIDIA GPU, zapamtite varijablu IGNORE_PREEMPT_RT_PRESENCE. A ako vaÅ¡ sluÄaj zahtijeva deterministiÄku virtualizaciju, ACRN sa namjenskim prolazom na NUC-u sa NVMe+SATA je solidna osnova za RTVM koji reaguje odmah nakon instalacije.