Si treballeu amb sistemes on el temps de resposta ho és tot, PREEMPT_RT és l'ingredient que converteix un Linux «normal» en un sistema apte per a temps real. Parlem de latències controlades, planificadors amb prioritat estricta i eines d'anàlisi que permeten afinar fins al darrer microsegon. En aquest tutorial-dossier trobaràs, ben ordenat, què és PREEMPT_RT, el seu estat al nucli, com instal·lar-lo o compilar-lo, com mesurar i optimitzar, i fins i tot com muntar-lo en una VM de temps real amb ACRN.
A més de la teoria, et porto instruccions pràctiques recolzades per scripts que automatitzen la compilació de kernels RT, paquets llestos per utilitzar en distribucions populars i receptes Yocto. Veureu també com verificar que el sistema corre en mode RT, quines opcions del nucli convé desactivar per evitar pics de latència i com afinar IRQs, CPU i serveis. Fins i tot toquem la compatibilitat amb controladors NVIDIA en entorns PREEMPT_RT i un cas real amb Clear Linux en un Intel NUC preparat per a tasques crítiques.
Què és PREEMPT_RT i en quin punt és al nucli
PREEMPT_RT neix com una sèrie de pegats que transformen Linux en un sistema amb comportament de temps real, amb l'objectiu de reduir latències i garantir previsibilitat. El projecte va arrencar el 2005 sota el paraigua Realtime-Preempt (-rt), va passar a la Fundació Linux el 2015 i ha estat clau per a sectors com finances, àudio/vídeo professional, aviació, medicina, robòtica, telecom i automatització industrial.
Des del 2019 se n'ha anat promovent el codi cap al nucli principal. Amb la sèrie 6.12 s'habilita la configuració de temps real al nucli principal per a x86, ARM64 i RISC‑V, desbloquejada després de la integració de peces crítiques de printk i suport de consola atòmica. El controlador UART 8250 disposa de consola atòmica, mentre que altres arquitectures com ARM i POWERPC encara requereixen integrar parts essencials, per la qual cosa el seu suport complet pot arribar una mica més tard si no hi entra tot a temps.
Tot i que el suport bàsic aterra en 6.12, els mantenidors recomanen seguir els pegats PREEMPT_RT més recents a la cua RT quan busques el millor comportament (noves arquitectures, ajustaments per a gràfics accelerats i millores que sempre arriben abans a la cua de pegats). En entorns productius s'aconsella fer servir la versió estable més recent de l'arbre RT.
Conceptualment, el canvi clau és la capacitat de preemptar gairebé qualsevol part del nucli, reduint finestres no interrompubles. Això es tradueix en menor jitter i respostes més predictibles davant d'un nucli genèric, una cosa indispensable quan una tasca no pot esperar.

Configuració essencial del kernel per a temps real
La configuració principal és activar el nucli completament preemptible: CONFIG_PREEMPT_RT. En kernels recents apareix sota «General Setup» i, si no ho veieu, habilitar CONFIG_EXPERT sol descobrir l'opció. En versions anteriors, PREEMPT_RT pot estar dins del menú de Preemption Model.
Hi ha configuracions comunes orientades a depuració que disparen les latències i convé desactivar quan busques temps real. Exemples típics que cal evitar: DEBUG_LOCKDEP, DEBUG_PREEMPT, DEBUG_OBJECTS i SLUB_DEBUG. Si partiu del .config d'una distribució, és probable que alguna d'aquestes estigui activa; revisa i neta per reduir jitter.
Construir i arrencar un nucli amb PREEMPT_RT no difereix gaire d'un nucli estàndard, llevat de les opcions anteriors. Tingueu en compte que algunes eines de compilació canvien subtilment a partir de Linux 6.x, i certs passos poden requerir paquets addicionals (més avall veuràs detalls pràctics durant la compilació automàtica).
Instal·lació ràpida en distribucions i verificació del mode RT
Instal·lació de Debian:
sudo apt-get install linux-image-rt-amd64
A Yocto hi ha una recepta específica per al nucli RT i una altra imatge que la fa servir per defecte. El proveïdor del nucli sol fixar-se així a local.conf, bblayers.conf oa $MACHINE.conf:
Exemple Yocto:
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-rt"
Si muntes un BSP que vulgui utilitzar linux-yocto-rt per defecte, afegeix a més aquest ajust en un bbappend per a linux-yocto-rt: amb això limites el suport a la teva màquina i evites compatibilitats no desitjades:
Exemple bbappend:
COMPATIBLE_MACHINE:$MACHINE = $MACHINE
Després d'arrencar, comprova que realment estàs en temps real. Cerca l'indicador PREEMPT_RT a uname i valida /sys/kernel/realtime:
Comprovar mode RT:
uname -a
cat /sys/kernel/realtime # debe devolver 1
Un altre punt important és el temps de CPU reservat per a tasques no RT, que per defecte evita que un fil de temps real bloquegi el sistema. Ajusta el límit global de SCHED_FIFO/SCHED_RR en microsegons o desactiva-ho si saps què fas:
Ajust de temps 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
Compilació i desplegament automatitzats amb scripts
Si prefereixes compilar i instal·lar el teu nucli RT, hi ha scripts que ho fan gairebé automàtic, incloent selecció de versió i suport addicional (Docker, NVIDIA, etc.). El flux típic comença identificant el teu nucli actual per triar una versió RT propera:
Detecta la teva versió:
uname -r # por ejemplo: 5.15.XX-generic → elegir 5.15.XX-rt-YY o lo más próximo
Exemple d'ús d'un dipòsit amb scripts per compilar i instal·lar PREEMPT_RT guiada a Debian/Ubuntu, dins d'un workspace local. Aquests passos automatitzen dependències, descàrrega de fonts i empaquetat:
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
Durant l'execució podreu triar la versió del nucli i el mode d'instal·lació (Debian). Si la compilació falla, revisa i ajusta el fitxer .config; en algunes versions 6.1.x, per exemple, es van haver d'afegir paquets i variar l'objectiu de build:
# 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
Després d'instal·lar, creeu un grup per a permisos RT i afegiu el vostre usuari. Això permet assignar prioritats i bloqueig de memòria sense haver de ser root per a totes les ordres:
sudo addgroup realtime
sudo usermod -a -G realtime $(whoami)
Configura els límits a /etc/security/limits.conf perquè els membres de «realtime» tinguin prioritat i memlock adequats. Aquest paràmetre evita errors per límits d'usuari en elevar prioritats o bloquejar memòria:
# 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
Si obtens errors de capçaleres absents després d'instal·lar el kernel, revisa /usr/src i, si cal, instal·la el paquet de headers corresponent. És important seleccionar el paquet rt correcte:
cd /ruta/donde/compilaste/el/kernel
sudo dpkg -i linux-headers-*<TAB TAB> # elige el que termine en -rt
Per a controladors NVIDIA a RT, pots forçar la instal·lació ignorant la detecció de PREEMPT_RT. Això facilita que DKMS compile els mòduls sobre el kernel de temps real:
export IGNORE_PREEMPT_RT_PRESENCE=1
sudo -E apt-get install nvidia-driver-XXX # p.ej. XXX=535
Si el driver ja estava instal·lat abans del pegat RT, instal·la manualment el mòdul per a la teva versió i kernel. Assegureu-vos d'apuntar al número correcte de versió del driver i al 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
Eines d'avaluació: cyclictest, timerlat i més
Per mesurar la qualitat RT, l'eina clàssica és cyclictest, part del paquet rt-tests, disponible a la majoria de distros. A Debian/derivades la instal·lació és directa:
sudo apt-get install rt-tests
Un exemple de prova llança un fil per CPU amb SCHED_FIFO 98, interval de 250 µs, i mostra latències en microsegons. Aquest patró simula càrrega RT periòdica per detectar pics i jitter:
sudo cyclictest -S -m -p98 -i250
En temps real es fan servir dues classes de planificació: SCHED_FIFO i SCHED_RR. FIFO executa amb prioritat fixa (1..99) fins que cedeix la CPU o arriba un fil de més prioritat; RR reparteix el temps quan hi ha diversos fils a la mateixa prioritat. Triar la classe adequada marca diferències clares en cues de treball de baixa latència.
El nucli incorpora traçadors que ajuden a diagnosticar latències de despertar. El tracer timerlat i l'eina d'espai d'usuari rtla permeten veure i correlacionar retards a IRQ, fils de kernel i usuari. Un ús típic, parant automàticament si se supera un llindar, seria:
Ús típic de rtla:
sudo rtla timerlat top -a 4000 -Pf:98
# ... al superar 4000 µs detiene el tracing y muestra posibles causas
La comunitat OSADL manté pegats útils per avaluar latències mitjançant histogrames al mateix nucli. Des de debugfs pots llegir màxims per CPU i veure quina tasca va estar implicada en el retard més gran:
Histograma de latències:
cd /sys/kernel/debug/latency_hist/timerandwakeup
cat max_latency-CPU*
Un apunt pràctic: en algunes distros hi ha serveis de sistema (per exemple, certs NTP) que arrenquen amb prioritat RT i poden interferir amb els fils crítics. Passa un top/ps ordenat per prioritat per localitzar processos amb SCHED_FIFO/RR actius i reajusta si cal.
Afinat del sistema: interrupcions, prioritats i aïllament de nuclis
Per defecte, els fils dinterrupció sexecuten amb SCHED_FIFO a prioritat 50. Podeu elevar prioritats d'IRQ crítiques (per exemple, d'una NIC) i coordinar amb NAPI per reduir latències de xarxa:
Exemple ajustaments 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
Per dedicar nuclis complets a càrregues RT, podeu aïllar CPUs del planificador general i de la ruta d'interrupcions. Aquests paràmetres del nucli a la línia d'arrencada ajuden a reduir la interferència de tasques de sistema:
isolcpus=2,3 rcu_nocbs=2,3 nohz_full=2,3 irqaffinity=0
Assignar afinitat IRQ:
echo 4 | sudo tee /proc/irq/<irq_number>/smp_affinity
Per comprovar resultats, repeteix proves amb cyclictest/rtla i valida que les cues de la teva aplicació i les seves IRQ associades conviuen amb una contenció mínima. Recorda que sempre hi haurà certes tasques de “housekeeping” que el sistema mantindrà fora del teu control al 100%.
Desplegament d'una VM de temps real amb ACRN (Clear Linux a Intel NUC)
Una altra possibilitat és executar un convidat Linux a temps real sobre l'hipervisor ACRN. Per a un RTVM (Real-Time VM) necessites que els seus dispositius en passthrough estiguin dedicats i sota controladors PCI diferents dels del SOS (Service OS). Un NUC Intel KBL (com NUC7ixDNHE) és molt pràctic en disposar de NVMe i SATA separats.
Un flux d'exemple seria: instal·lació de Clear Linux (v29400) tant a l'NVMe com al SATA; configurar el SATA com a SOS i afegir l'hipervisor a la partició EFI. Després, preparar i llançar el convidat RT sobre el NVMe amb els bundles i mòduls adequats.
Passos pràctics: afegeix el bundle kernel-lts2018-preempt-rt, copia el mòdul preempt-rt al disc NVMe i recupera els IDs PCI per a passthrough (p. ex., [01:00.0] i [8086:f1a6]). Modifica l'script launch_hard_rt_vm.sh per passar el NVMe al convidat i configura la xarxa segons les teves necessitats:
Opcions de xarxa:
# Opción 1: virtio-net
# Opción 2: passthrough de una NIC PCIe
Arranca la VM en temps real i comprova el nucli amb uname -a dins del convidat. Un cop operatiu, instal·la rt-tests i llança cyclictest per validar el comportament:
sudo cyclictest -S -m -p98 -i250
Per optimitzar encara més, ajusta BIOS/UEFI desactivant tecnologies que estalvien energia però introdueixen latències i habilitant capacitats de virtualització. Una guia de referència per a BIOS en plataformes d'aquest tipus inclouria una cosa així:
| Article | ajust |
|---|---|
| VMX | habilitat |
| VT-d | habilitat |
| Hiperfilaritat | Discapacitat |
| Pas de velocitat | Discapacitat |
| Canvi de velocitat | Discapacitat |
| Estat C | Discapacitat |
| Optimització de voltatge | Discapacitat |
| GT RC6 | Discapacitat |
| Mode de baix consum Gfx | Discapacitat |
| SA GV | Discapacitat |
| Suport LPM agressiu | Discapacitat |
| ACPI S3 Support | Discapacitat |
| ASPM nadiu | Discapacitat |
Notes, referències i material de suport
Si voleu aprofundir en conceptes, subsistemes i canvis que habiliten el mode RT (incloent-hi traçat, planificadors i detalls d'arquitectura), trobareu materials formatius molt complets. Per exemple, aquestes diapositives dedicades a PREEMPT_RT us poden resultar molt útils: Descarregar PDF
Algunes distribucions ofereixen binaris RT preconstruïts o integracions als seus sistemes de build. És un bon punt de partida per avaluar sense compilar des de zero i comparar resultats amb el teu nucli a mida.
Preguntes habituals: activació, distros i arguments del nucli
Amb l'arribada de 6.12, l'opció PREEMPT_RT s'integra al nucli principal per a diverses arquitectures. Que s'activi per defecte depèn de cada distribució: algunes mantenen variants RT separades, d'altres ofereixen paquets específics i d'altres el deixen per a compilacions a mida. Sempre revisa les notes del teu distro i, si hi ha un «linux-image-rt» o similar, és la via recomanada per començar.
Sobre l'argument del nucli preempt=full: no equival a PREEMPT_RT i el seu efecte depèn de la configuració compilada. Si en passar preempt=full en kernels recents (per exemple, a partir de 6.10.6) el vostre sistema no arrenca, elimina aquest paràmetre i verifica la configuració real del kernel. Per a temps real estricte, el camí és activar/configurar CONFIG_PREEMPT_RT o instal·lar el nucli RT de la teva distribució.
Comprova sempre que /sys/kernel/realtime val 1 i que uneixi mostra PREEMPT_RT. Evita barrejar expectatives de «baixa latència» amb «temps real»; són perfils diferents amb objectius diferents. Si necessites RT dur, prioritza un nucli RT estable i eines de diagnòstic (cyclictest/rtla) abans de tocar arguments agressius al bootloader.
Muntar un Linux de temps real avui és més directe gràcies al fet que PREEMPT_RT desembarca al mainline i que hi ha paquets, receptes i scripts que t'estalvien hores. Comença validant amb binaris RT on existeixin, mesura amb cyclictest/rtla, desactiva opcions de depuració que fan malbé la latència, ajusta prioritats/IRQs i aïlla CPUs quan la teva càrrega ho exigeixi. Si compileu, recolza't en scripts que generin .deb i prepara límits d'usuari per a treball RT; si utilitzeu GPU NVIDIA, recordeu la variable IGNORE_PREEMPT_RT_PRESENCE. I si el vostre cas requereix virtualització determinista, ACRN amb passthrough dedicat a un NUC amb NVMe+SATA és una base sòlida per a un RTVM que respongui a la primera.