Pokud pracujete se systémy, kde je doba odezvy vším, PREEMPT_RT je ingrediencí, která promění „normální“ Linux v systém připravený na reálný čas. Mluvíme o řízených latencích, plánovačích s přísnou prioritou a analytických nástrojích, které umožňují jemné ladění až do poslední mikrosekundy.V tomto tutoriálu naleznete přehledný popis toho, co je PREEMPT_RT, jaký je jeho stav v jádře, jak jej nainstalovat nebo zkompilovat, jak jej měřit a optimalizovat a dokonce i jak jej nastavit v reálném čase na virtuálním počítači s ACRN.
Kromě teorie vám přináším praktické instrukce podložené skripty, které automatizují kompilaci RT jader, hotové balíčky v populárních distribucích a recepty Yocto. Také uvidíte, jak ověřit, zda systém běží v režimu RT, které možnosti jádra zakázat, abyste se vyhnuli špičkám latence, a jak jemně doladit IRQ, CPU a služby.Dokonce jsme se zabývali kompatibilitou ovladačů NVIDIA v prostředích PREEMPT_RT a reálným případem s Clear Linuxem na počítači Intel NUC určeném pro kritické úkoly.
Co je PREEMPT_RT a kam v jádře patří?
PREEMPT_RT byl vytvořen jako série záplat, které transformují Linux na systém pracující v reálném čase s cílem snížit latenci a zajistit předvídatelnost. Projekt začal v roce 2005 pod záštitou Realtime-Preempt (-rt), v roce 2015 byl předán Linux Foundation a od té doby se stal klíčovým pro odvětví, jako jsou finance, profesionální audio/video, letectví, medicína, robotika, telekomunikace a průmyslová automatizace..
Od roku 2019 je jeho kód povýšen do hlavního jádra. Řada 6.12 umožňuje konfiguraci v reálném čase v hlavním jádře pro x86, ARM64 a RISC-V, která se odemkne po integraci kritických komponent printk a podpory atomické konzole.Řadič UART 8250 má atomickou konzoli, zatímco jiné architektury, jako jsou ARM a POWERPC, stále vyžadují integraci základních částí, takže jejich plná podpora může dorazit o něco později, pokud nebude vše zahrnuto včas.
Ačkoli základní podpora končí ve verzi 6.12, správci doporučují sledovat nejnovější záplaty PREEMPT_RT ve frontě RT, pokud hledáte nejlepší výkon (nové architektury, vylepšení pro akcelerovanou grafiku a vylepšení, která vždy dorazí jako první ve frontě záplat). V produkčním prostředí je vhodné používat nejnovější stabilní verzi RT stromu..
Koncepčně je klíčovou změnou možnost preemptovat téměř jakoukoli část jádra, čímž se snižuje počet nepřerušitelných oken. To se promítá do menšího jitteru a předvídatelnějších odpovědí ve srovnání s generickým jádrem., něco nepostradatelného, když úkol nemůže čekat.

Základní konfigurace jádra pro práci v reálném čase
Hlavním nastavením je povolení plně preemptabilního jádra: CONFIG_PREEMPT_RT. V novějších jádrech se zobrazuje v části „Obecné nastavení“ a pokud ji nevidíte, povolení CONFIG_EXPERT tuto možnost obvykle zobrazí.V předchozích verzích se PREEMPT_RT mohl nacházet v nabídce „Model preempce“.
Existují běžná nastavení zaměřená na ladění, která zvyšují latenci a měla by být zakázána, pokud hledáte výkon v reálném čase. Typické příklady, kterým je třeba se vyhnout: DEBUG_LOCKDEP, DEBUG_PREEMPT, DEBUG_OBJECTS a SLUB_DEBUGPokud začnete se souborem .config distribuce, je pravděpodobné, že jeden z nich je aktivní; zkontrolujte a vyčistěte ho, abyste snížili chvění.
Sestavení a zavedení jádra s PREEMPT_RT se příliš neliší od standardního jádra, s výjimkou výše zmíněných možností. Upozorňujeme, že některé nástroje pro sestavení se od verze Linux 6.x nenápadně mění a určité kroky mohou vyžadovat další balíčky. (Praktické podrobnosti uvidíte níže během automatické kompilace).
Rychlá instalace na distribucích a ověření v RT režimu
Instalace na Debianu:
sudo apt-get install linux-image-rt-amd64
Yocto má specifický recept pro RT kernel a další obraz, který jej používá ve výchozím nastavení. Poskytovatel jádra se obvykle nastavuje v souboru local.conf, bblayers.conf nebo $MACHINE.conf.:
Příklad Yocto:
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-rt"
Pokud nastavujete BSP, který chce ve výchozím nastavení používat linux-yocto-rt, přidejte také toto nastavení do bbappend pro linux-yocto-rt: Tím se omezí podpora pro váš počítač a zabrání se nežádoucím problémům s kompatibilitou.:
Příklad bappend:
COMPATIBLE_MACHINE:$MACHINE = $MACHINE
Po spuštění zkontrolujte, zda se skutečně nacházíte v reálném čase. Vyhledejte indikátor PREEMPT_RT v souboru uname a ověřte /sys/kernel/realtime.:
Zkontrolujte režim RT:
uname -a
cat /sys/kernel/realtime # debe devolver 1
Dalším důležitým bodem je čas CPU vyhrazený pro úlohy, které nejsou RT, což ve výchozím nastavení zabraňuje blokování systému vláknem v reálném čase. Upravte globální limit SCHED_FIFO/SCHED_RR v mikrosekundách nebo jej deaktivujte, pokud víte, co děláte.:
Nastavení času 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
Automatická kompilace a nasazení pomocí skriptů
Pokud dáváte přednost kompilaci a instalaci RT jádra, existují skripty, které to dělají téměř automaticky, včetně výběru verze a další podpory (Docker, NVIDIA atd.). Typický postup začíná identifikací aktuálního jádra a výběrem podobné verze RT.:
Zjistěte svou verzi:
uname -r # por ejemplo: 5.15.XX-generic → elegir 5.15.XX-rt-YY o lo más próximo
Příklad použití repozitáře se skripty pro kompilaci a instalaci PREEMPT_RT v řízeném režimu na Debianu/Ubuntu v rámci lokálního pracovního prostoru. Tyto kroky automatizují závislosti, stahování zdrojového kódu a balení.:
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
Během spuštění budete moci zvolit verzi jádra a režim instalace (Debian). Pokud sestavení selže, zkontrolujte a upravte soubor .config; například v některých verzích 6.1.x bylo nutné přidat balíčky a změnit cíl sestavení.:
# 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
Po instalaci vytvořte skupinu pro RT oprávnění a přidejte svého uživatele. To umožňuje přiřazovat priority a uzamykat paměť, aniž byste pro všechny příkazy potřebovali root oprávnění.:
sudo addgroup realtime
sudo usermod -a -G realtime $(whoami)
Nakonfigurujte limity v souboru /etc/security/limits.conf tak, aby členové „realtime“ měli odpovídající prioritu a memlock. Toto nastavení zabraňuje selháním uživatelských limitů zvýšením priorit nebo blokováním paměti.:
# 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
Pokud se po instalaci jádra zobrazí chyba s chybějícími hlavičkami, zkontrolujte soubor /usr/src a v případě potřeby nainstalujte odpovídající balíček s hlavičkami. Je důležité vybrat správný RT balíček:
cd /ruta/donde/compilaste/el/kernel
sudo dpkg -i linux-headers-*<TAB TAB> # elige el que termine en -rt
U ovladačů NVIDIA na RT můžete instalaci vynutit ignorováním detekce PREEMPT_RT. Díky tomu je pro DKMS snazší kompilaci modulů v jádře reálného času.:
export IGNORE_PREEMPT_RT_PRESENCE=1
sudo -E apt-get install nvidia-driver-XXX # p.ej. XXX=535
Pokud byl ovladač nainstalován již před aktualizací RT, nainstalujte modul pro vaši verzi a jádro ručně. Ujistěte se, že odkazujete na správné číslo verze ovladače a 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
Nástroje pro hodnocení: cyclictest, timerlat a další
Pro měření kvality RT je klasickým nástrojem cyclictest, který je součástí balíčku rt-tests a je k dispozici ve většině distribucí. V Debianu/derivátech je instalace přímočará:
sudo apt-get install rt-tests
Testovací příklad spouští jedno vlákno na CPU s parametrem SCHED_FIFO 98, intervalem 250 µs a zobrazuje latence v mikrosekundách. Tento vzorec simuluje periodické RT zatížení pro detekci špiček a jitteru:
sudo cyclictest -S -m -p98 -i250
V reálném čase se používají dvě třídy plánování: SCHED_FIFO a SCHED_RR. FIFO se provádí s pevnou prioritou (1..99), dokud se neuvolní CPU nebo nepřijde vlákno s vyšší prioritou; RR dělí čas, když existuje více vláken se stejnou prioritou.Výběr správné třídy má jasný vliv na pracovní fronty s nízkou latencí.
Jádro obsahuje sledovače, které pomáhají diagnostikovat latenci probuzení. Sledovač timerlat a nástroj rtla pro uživatelský prostor umožňují zobrazit a korelovat zpoždění v IRQ, vláknech jádra a uživatelských vláknech.Typický případ použití, automatické zastavení při překročení prahové hodnoty, by byl:
Typické použití rtla:
sudo rtla timerlat top -a 4000 -Pf:98
# ... al superar 4000 µs detiene el tracing y muestra posibles causas
Komunita OSADL udržuje užitečné záplaty pro vyhodnocování latence pomocí histogramů v samotném jádře. Z debugfs si můžete přečíst maxima CPU a zjistit, která úloha způsobila největší zpoždění.:
Histogram latence:
cd /sys/kernel/debug/latency_hist/timerandwakeup
cat max_latency-CPU*
Praktická poznámka: v některých distribucích existují systémové služby (například určité NTP), které začínají s prioritou RT a mohou kolidovat s vašimi kritickými vlákny. Spusťte příkaz top/ps seřazený podle priority, abyste vyhledali procesy s aktivním SCHED_FIFO/RR a v případě potřeby jej upravili..
Ladění systému: přerušení, priority a izolace jádra
Ve výchozím nastavení vlákna přerušení běží s prioritou SCHED_FIFO 50. Můžete zvýšit priority kritických IRQ (například ze síťové karty) a koordinovat to s NAPI, abyste snížili latenci sítě.:
Příklad nastavení 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
Chcete-li vyhradit celá jádra pro úlohy RT, můžete izolovat CPU od obecného plánovače a cesty přerušení. Tyto parametry jádra v bootovacím řádku pomáhají omezit rušení systémovými úlohami.:
isolcpus=2,3 rcu_nocbs=2,3 nohz_full=2,3 irqaffinity=0
Přiřadit afinitu IRQ:
echo 4 | sudo tee /proc/irq/<irq_number>/smp_affinity
Pro ověření výsledků zopakujte testy pomocí programu cyclictest/rtla a ověřte, zda fronty vaší aplikace a s nimi spojené IRQ koexistují s minimálními soupeřeními. Nezapomeňte, že vždy budou existovat určité úklidové úkoly, které systém 100% vymkne vaší kontrole..
Nasazení virtuálního počítače v reálném čase s ACRN (Clear Linux na Intel NUC)
Další možností je spustit hostovaný Linux v reálném čase na hypervizoru ACRN. Pro RTVM (virtuální počítač v reálném čase) potřebujete, aby jeho průchozí zařízení byla vyhrazená a pod PCI řadiči jinými než řadiče SOS (servisní OS).Intel KBL NUC (jako NUC7ixDNHE) je velmi praktický, protože má oddělené NVMe a SATA disky.
Příkladný pracovní postup by byl: instalace Clear Linuxu (v29400) na disky NVMe i SATA; konfigurace disku SATA jako SOS a přidání hypervisoru do oddílu EFI. Dále připravte a spusťte hosta RT na NVMe s příslušnými balíčky a moduly..
Praktické kroky: Přidejte balíček kernel-lts2018-preempt-rt, zkopírujte modul preempt-rt na NVMe disk a načtěte PCI ID pro průchod (např. [01:00.0] a [8086:f1a6]). Upravte skript launch_hard_rt_vm.sh pro přenos NVMe do hosta a nakonfigurujte síť podle svých potřeb.:
Možnosti sítě:
# Opción 1: virtio-net
# Opción 2: passthrough de una NIC PCIe
Spusťte virtuální počítač v reálném čase a zkontrolujte jádro pomocí uname -a uvnitř hosta. Jakmile je systém funkční, nainstalujte rt-tests a spusťte cyclictest pro ověření chování.:
sudo cyclictest -S -m -p98 -i250
Pro další optimalizaci upravte BIOS/UEFI vypnutím technologií, které šetří energii, ale způsobují latenci, a povolením virtualizačních funkcí. Referenční příručka BIOSu pro platformy tohoto typu by měla obsahovat něco jako toto:
| Položka | Ajuste |
|---|---|
| VMX | Povoleno |
| VT-d | Povoleno |
| Hyper-Threading | invalidní |
| Rychlostní krok | invalidní |
| Řazení rychlosti | invalidní |
| C-State | invalidní |
| Optimalizace napětí | invalidní |
| GT RC6 | invalidní |
| Režim nízké spotřeby energie Gfx | invalidní |
| SA GV | invalidní |
| Agresivní podpora LPM | invalidní |
| Podpora ACPI S3 | invalidní |
| Nativní ASPM | invalidní |
Poznámky, odkazy a podpůrné materiály
Pokud se chcete hlouběji ponořit do konceptů, subsystémů a změn, které umožňují režim RT (včetně rozvržení, plánovačů a architektonických detailů), najdete zde velmi komplexní školicí materiály. Například tyto slajdy věnované PREEMPT_RT by pro vás mohly být velmi užitečné.: Stáhnout PDF
Některé distribuce nabízejí předpřipravené binární soubory RT nebo integrace ve svých systémech sestavení. Je to dobrý výchozí bod pro vyhodnocování bez nutnosti kompilace od nuly a porovnávání výsledků s vaším vlastním jádrem..
Často kladené otázky: aktivace, distribuce a argumenty jádra
S příchodem verze 6.12 je volba PREEMPT_RT integrována do hlavního jádra pro různé architektury. Zda je to ve výchozím nastavení povoleno, závisí na distribuci: některé udržují samostatné varianty RT, jiné nabízejí specifické balíčky a další to nechávají pro vlastní sestavení.Vždy si zkontrolujte poznámky k vydání vaší distribuce a pokud existuje soubor „linux-image-rt“ nebo podobný, je to doporučený způsob, jak začít.
Pokud jde o argument jádra "preempt=full": není ekvivalentní PREEMPT_RT a jeho účinek závisí na kompilované konfiguraci. Pokud zadání parametru `preempt=full` v novějších jádrech (například od verze 6.10.6) nespustí váš systém, odeberte tento parametr a zkontrolujte skutečnou konfiguraci jádra.Pro striktní provoz v reálném čase je nejlepší povolit/nakonfigurovat CONFIG_PREEMPT_RT nebo nainstalovat RT kernel pro vaši distribuci.
Vždy zkontrolujte, zda je /sys/kernel/realtime nastaveno na 1 a zda uname zobrazuje PREEMPT_RT. Vyhněte se spojování očekávání „nízké latence“ s „reálným časem“; jedná se o odlišné profily s různými cíli.Pokud potřebujete hard RT, upřednostněte stabilní RT jádro a diagnostické nástroje (cyclictest/rtla) předtím, než se dotknete agresivních argumentů v bootloaderu.
Nastavení linuxového systému v reálném čase je dnes jednodušší díky příchodu PREEMPT_RT do hlavní řady, protože obsahuje balíčky, recepty a skripty, které vám ušetří hodiny. Začněte ověřováním binárních souborů RT, pokud existují, změřte je pomocí cyclictest/rtla, vypněte možnosti ladění, které poškozují latenci, upravte priority/IRQ a izolujte CPU, když to vaše pracovní zátěž vyžaduje.Pokud kompilujete, používejte skripty, které generují soubory .deb a nastavují limity uživatelů pro práci s RT; pokud používáte grafickou kartu NVIDIA, nezapomeňte na proměnnou IGNORE_PREEMPT_RT_PRESENCE. A pokud váš případ vyžaduje deterministickou virtualizaci, ACRN s vyhrazeným průchodem na NUC s NVMe+SATA je solidním základem pro RTVM, který reaguje ihned po vybalení.