PREEMPT_RT tutorijal na Linuxu: Instalacija, testiranje i podešavanje

  • PREEMPT_RT smanjuje latenciju i sada se moÅŸe konfigurirati u glavnom kernelu za x86, ARM64 i RISC-V.
  • Instalirajte RT binarne datoteke (npr. Debian) ili kompajlirajte sa skriptama, onemogućite opcije za otklanjanje greÅ¡aka koje povećavaju podrhtavanje.
  • Validirajte pomoću cyclictest/rtla i prilagodite IRQ-ove, prioritete i izolaciju CPU-a za kritična opterećenja.
  • PodrÅŸava napredne scenarije: NVIDIA drajvere u RT i RTVM sa ACRN i namjenskim prolazom.

Glavna slika tutorijala za Linux PREEMPT_RT

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.

PREEMPT_RT konfiguracija Linuxa

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.


Dodaj kao preferirani izvor