Tepki süresinin her şey olduğu sistemlerle çalışıyorsanız, PREEMPT_RT "normal" bir Linux'u gerçek zamanlı çalışmaya hazır bir sisteme dönüştüren bileşendir. Kontrollü gecikmelerden, sıkı önceliğe sahip zamanlayıcılardan ve son mikro saniyeye kadar ince ayar yapmaya olanak tanıyan analiz araçlarından bahsediyoruz.Bu eğitim dosyasında, PREEMPT_RT'nin ne olduğunu, çekirdekteki durumunu, nasıl kurulacağını veya derleneceğini, nasıl ölçülüp optimize edileceğini ve hatta ACRN ile gerçek zamanlı bir VM'de nasıl kurulacağını iyi organize edilmiş bir şekilde bulacaksınız.
Teorinin yanı sıra, RT çekirdeklerinin derlenmesini otomatikleştiren scriptler, popüler dağıtımlardaki hazır paketler ve Yocto tarifleri ile desteklenen pratik talimatlar da getiriyorum. Ayrıca sistemin RT modunda çalıştığını nasıl doğrulayacağınızı, gecikme artışlarını önlemek için hangi çekirdek seçeneklerinin devre dışı bırakılacağını ve IRQ'ların, CPU'nun ve hizmetlerin nasıl ince ayar yapılacağını da göreceksiniz.Hatta PREEMPT_RT ortamlarında NVIDIA sürücü uyumluluğunu ve görev açısından kritik görevler için tasarlanmış bir Intel NUC üzerinde Clear Linux ile gerçek bir durumu bile ele aldık.
PREEMPT_RT nedir ve çekirdekte nereye yerleşir?
PREEMPT_RT, Linux'u gerçek zamanlı bir sisteme dönüştüren, gecikmeyi azaltmayı ve öngörülebilirliği sağlamayı amaçlayan bir dizi yama olarak oluşturuldu. Proje, 2005 yılında Gerçek Zamanlı Önleme (-rt) şemsiyesi altında başlatıldı, 2015 yılında Linux Vakfı'na geçti ve finans, profesyonel ses/görüntü, havacılık, tıp, robotik, telekomünikasyon ve endüstriyel otomasyon gibi sektörler için önemli bir rol oynadı..
2019 yılından itibaren kodu ana çekirdeğe doğru ilerletildi. 6.12 serisi, kritik printk bileşenlerinin ve atomik konsol desteğinin entegrasyonundan sonra x86, ARM64 ve RISC-V için ana çekirdekte gerçek zamanlı yapılandırmayı mümkün kılıyor.UART 8250 kontrolcüsü atomik bir konsola sahipken, ARM ve POWERPC gibi diğer mimariler hala temel parçaların entegrasyonunu gerektiriyor, bu nedenle her şey zamanında dahil edilmezse tam destek biraz daha sonra gelebilir.
Temel destek 6.12'de sona erse de, bakımcılar en iyi performansı (yeni mimariler, hızlandırılmış grafikler için ince ayarlar ve yama kuyruğunda her zaman ilk gelen iyileştirmeler) ararken RT kuyruğundaki en son PREEMPT_RT yamalarını takip etmeyi öneriyor. Üretim ortamlarında RT ağacının en son kararlı sürümünün kullanılması önerilir..
Kavramsal olarak en önemli değişiklik, çekirdeğin hemen hemen her bölümünün önceden engellenebilmesi ve böylece kesintisiz pencere sayısının azaltılmasıdır. Bu, genel bir çekirdeğe kıyasla daha az titreme ve daha öngörülebilir yanıtlar anlamına gelir, bir görevin bekletilemeyeceği durumlarda vazgeçilmez bir şeydir.

Gerçek zamanlı için temel çekirdek yapılandırması
Ana ayar, tamamen önceden kesilebilen çekirdeği etkinleştirmektir: CONFIG_PREEMPT_RT. Son çekirdeklerde, "Genel Kurulum" altında görünür ve eğer görmüyorsanız, CONFIG_EXPERT'i etkinleştirmek genellikle seçeneği ortaya çıkarır.Önceki sürümlerde PREEMPT_RT, "Önleme Modeli" menüsü içerisinde yer alabilirdi.
Gerçek zamanlı performansa baktığınızda gecikmeyi artıran ve devre dışı bırakılması gereken yaygın hata ayıklama odaklı ayarlar vardır. Kaçınılması gereken tipik örnekler: DEBUG_LOCKDEP, DEBUG_PREEMPT, DEBUG_OBJECTS ve SLUB_DEBUGBir dağıtımın .config dosyasıyla başlarsanız, bunlardan birinin etkin olması muhtemeldir; titremeyi azaltmak için dosyayı kontrol edin ve temizleyin.
PREEMPT_RT ile bir çekirdeği derlemek ve başlatmak, yukarıda belirtilen seçenekler dışında standart bir çekirdekten çok da farklı değildir. Bazı derleme araçlarının Linux 6.x'ten itibaren yavaş yavaş değiştiğini ve bazı adımların ek paketler gerektirebileceğini unutmayın. (Otomatik derleme sırasında pratik detayları aşağıda göreceksiniz).
Dağıtımlarda hızlı kurulum ve RT modu doğrulaması
Debian üzerine kurulum:
sudo apt-get install linux-image-rt-amd64
Yocto'nun RT çekirdeği için özel bir tarifi ve onu varsayılan olarak kullanan başka bir görüntüsü var. Çekirdek sağlayıcısı genellikle local.conf, bblayers.conf veya $MACHINE.conf'da ayarlanır:
Yocto örneği:
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-rt"
Varsayılan olarak linux-yocto-rt kullanmak isteyen bir BSP kurarsanız, linux-yocto-rt için bbappend'e şu ayarı da ekleyin: Bu, makinenize verilen desteği sınırlar ve istenmeyen uyumluluk sorunlarının önüne geçer.:
Örnek bbappend:
COMPATIBLE_MACHINE:$MACHINE = $MACHINE
Başlattıktan sonra gerçek zamanlı olduğunuzu kontrol edin. Uname'de PREEMPT_RT göstergesini arayın ve /sys/kernel/realtime'ı doğrulayın:
RT modunu kontrol edin:
uname -a
cat /sys/kernel/realtime # debe devolver 1
Bir diğer önemli nokta ise RT dışı görevler için ayrılan CPU zamanıdır; bu sayede gerçek zamanlı bir iş parçacığının sistemi bloke etmesi önlenir. Küresel SCHED_FIFO/SCHED_RR sınırını mikrosaniye cinsinden ayarlayın veya ne yaptığınızı biliyorsanız devre dışı bırakın.:
RT zaman ayarı:
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
Betiklerle otomatik derleme ve dağıtım
RT çekirdeğinizi derleyip kurmayı tercih ederseniz, bunu neredeyse otomatik olarak yapan, sürüm seçimi ve ek destek (Docker, NVIDIA, vb.) de içeren betikler mevcuttur. Tipik akış, yakın bir RT sürümü seçmek için mevcut çekirdeğinizi tanımlayarak başlar:
Sürümünüzü tespit edin:
uname -r # por ejemplo: 5.15.XX-generic → elegir 5.15.XX-rt-YY o lo más próximo
Yerel bir çalışma alanında, Debian/Ubuntu'da PREEMPT_RT'yi rehberli bir şekilde derlemek ve kurmak için betikleri içeren bir deponun kullanımına örnek. Bu adımlar bağımlılıkları, kaynak indirmelerini ve paketlemeyi otomatikleştirir.:
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
Çalıştırma sırasında çekirdek sürümünü ve kurulum modunu (Debian) seçebileceksiniz. Derleme başarısız olursa, .config dosyasını kontrol edin ve ayarlayın; örneğin bazı 6.1.x sürümlerinde paket eklemek ve derleme hedefini değiştirmek gerekiyordu.:
# 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
Kurulumdan sonra RT izinleri için bir grup oluşturun ve kullanıcınızı ekleyin. Bu, tüm komutlar için kök ayrıcalıklarına ihtiyaç duymadan öncelikleri ve bellek kilitlemeyi atamanıza olanak tanır.:
sudo addgroup realtime
sudo usermod -a -G realtime $(whoami)
"Gerçek zamanlı" üyelerin uygun önceliğe ve bellek kilidine sahip olması için /etc/security/limits.conf dosyasındaki limitleri yapılandırın. Bu ayar, öncelikleri artırarak veya belleği engelleyerek kullanıcı sınırı hatalarını önler:
# 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
Çekirdeği yükledikten sonra eksik başlıklar hatası alırsanız, /usr/src'yi kontrol edin ve gerekirse ilgili başlık paketini yükleyin. Doğru RT paketini seçmek önemlidir:
cd /ruta/donde/compilaste/el/kernel
sudo dpkg -i linux-headers-*<TAB TAB> # elige el que termine en -rt
RT'deki NVIDIA sürücüleri için PREEMPT_RT algılamasını yok sayarak kurulumu zorlayabilirsiniz. Bu, DKMS'nin modülleri gerçek zamanlı çekirdekte derlemesini kolaylaştırır:
export IGNORE_PREEMPT_RT_PRESENCE=1
sudo -E apt-get install nvidia-driver-XXX # p.ej. XXX=535
Eğer sürücü RT yaması öncesinde zaten kuruluysa, sürümünüz ve çekirdeğiniz için modülü manuel olarak kurun. Doğru sürücü sürüm numarasını ve çekirdeği -rt işaret ettiğinizden emin olun:
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
Değerlendirme araçları: cyclistest, timerlat ve daha fazlası
RT kalitesini ölçmek için kullanılan klasik araç, çoğu dağıtımda bulunan rt-tests paketinin bir parçası olan cyclest'tir. Debian/derivatives'te kurulum basittir:
sudo apt-get install rt-tests
Bir test örneği, CPU başına bir iş parçacığını SCHED_FIFO 98 ile 250 µs aralığında başlatır ve gecikmeleri mikrosaniye cinsinden gösterir. Bu desen, sivri uçları ve titremeleri tespit etmek için periyodik RT yüklemesini simüle eder:
sudo cyclictest -S -m -p98 -i250
Gerçek zamanlı olarak iki planlama sınıfı kullanılır: SCHED_FIFO ve SCHED_RR. FIFO, CPU serbest bırakılıncaya veya daha yüksek öncelikli bir iş parçacığı gelene kadar sabit öncelikle (1..99) yürütülür; RR, aynı önceliğe sahip birden fazla iş parçacığı olduğunda zamanı bölerDoğru sınıfın seçilmesi düşük gecikmeli iş kuyruklarında belirgin bir fark yaratır.
Çekirdek, uyandırma gecikmelerini teşhis etmeye yardımcı olan izleyicileri bünyesinde barındırıyor. Timerlat izleyicisi ve rtla kullanıcı alanı aracı, IRQ'lardaki, çekirdek iş parçacıklarındaki ve kullanıcı iş parçacıklarındaki gecikmeleri görüntülemenize ve ilişkilendirmenize olanak tanır.Eşik değeri aşıldığında otomatik olarak durmayı sağlayan tipik bir kullanım durumu şöyle olabilir:
Rtla'nın tipik kullanımı:
sudo rtla timerlat top -a 4000 -Pf:98
# ... al superar 4000 µs detiene el tracing y muestra posibles causas
OSADL topluluğu, çekirdeğin kendisinde histogram kullanarak gecikmeleri değerlendirmek için yararlı yamalar bulundurmaktadır. Debugfs'den CPU maksimumlarını okuyabilir ve hangi görevin en büyük gecikmeye neden olduğunu görebilirsiniz:
Gecikme histogramı:
cd /sys/kernel/debug/latency_hist/timerandwakeup
cat max_latency-CPU*
Pratik bir not: Bazı dağıtımlarda RT önceliğiyle başlayan ve kritik iş parçacıklarınıza müdahale edebilen sistem servisleri (örneğin, belirli NTP'ler) bulunur. Etkin SCHED_FIFO/RR'ye sahip işlemleri bulmak için öncelik sıralı bir top/ps çalıştırın ve gerekirse yeniden ayarlayın.
Sistem ayarı: kesintiler, öncelikler ve çekirdek izolasyonu
Varsayılan olarak, kesme iş parçacıkları SCHED_FIFO ile 50. önceliğe göre çalışır. Kritik IRQ'ların (örneğin, bir NIC'den) önceliklerini yükseltebilir ve ağ gecikmesini azaltmak için NAPI ile koordineli çalışabilirsiniz.:
Örnek IRQ ayarları:
# 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
Tüm çekirdekleri RT iş yüklerine ayırmak için CPU'ları genel zamanlayıcıdan ve kesme yolundan izole edebilirsiniz. Önyükleme satırındaki bu çekirdek parametreleri, sistem görevlerinden kaynaklanan müdahaleyi azaltmaya yardımcı olur:
isolcpus=2,3 rcu_nocbs=2,3 nohz_full=2,3 irqaffinity=0
IRQ yakınlığını atayın:
echo 4 | sudo tee /proc/irq/<irq_number>/smp_affinity
Sonuçları doğrulamak için, cyclictest/rtla ile testleri tekrarlayın ve uygulamanızın kuyruklarının ve bunlara bağlı IRQ'ların minimum çekişmeyle bir arada var olduğunu doğrulayın. Sistemin her zaman %100 kontrolünüz dışında tutacağı belirli temizlik görevleri olacağını unutmayın..
ACRN (Intel NUC üzerinde Clear Linux) ile gerçek zamanlı bir VM dağıtımı
Bir diğer olasılık ise ACRN hipervizöründe gerçek zamanlı bir Linux misafir çalıştırmaktır. Bir RTVM (Gerçek Zamanlı VM) için, geçiş aygıtlarının özel olması ve SOS'un (Hizmet İşletim Sistemi)kinden farklı PCI denetleyicileri altında olması gerekir.Intel KBL NUC (NUC7ixDNHE gibi) ayrı NVMe ve SATA sürücülerine sahip olduğundan oldukça pratiktir.
Örnek bir iş akışı şöyle olabilir: Clear Linux'u (v29400) hem NVMe hem de SATA sürücülerine kurmak; SATA sürücüsünü SOS olarak yapılandırmak ve hipervizörü EFI bölümüne eklemek. Daha sonra, uygun paketler ve modüllerle NVMe üzerinde RT misafirini hazırlayın ve başlatın..
Pratik adımlar: kernel-lts2018-preempt-rt paketini ekleyin, preempt-rt modülünü NVMe diskine kopyalayın ve geçiş için PCI kimliklerini alın (örneğin, [01:00.0] ve [8086:f1a6]). launch_hard_rt_vm.sh betiğini değiştirerek NVMe'yi misafire aktarın ve ağı ihtiyaçlarınıza göre yapılandırın.:
Ağ seçenekleri:
# Opción 1: virtio-net
# Opción 2: passthrough de una NIC PCIe
Sanal makineyi gerçek zamanlı olarak başlatın ve konuk içindeki çekirdeği uname -a ile kontrol edin. Çalışır duruma geldiğinde, rt-tests'i yükleyin ve davranışı doğrulamak için cyclest'i çalıştırın:
sudo cyclictest -S -m -p98 -i250
Daha fazla iyileştirme için, enerji tasarrufu sağlayan ancak gecikmeye neden olan teknolojileri devre dışı bırakarak ve sanallaştırma yeteneklerini etkinleştirerek BIOS/UEFI'yi ayarlayın. Bu tür platformlar için bir BIOS başvuru kılavuzu buna benzer bir şey içerebilir:
| Öğe | ayarlama |
|---|---|
| VMX | Etkin |
| VT-d | Etkin |
| Hyper-Threading | Yayından kaldırıldı |
| Hız Adımı | Yayından kaldırıldı |
| Hız Değişimi | Yayından kaldırıldı |
| C-Devlet | Yayından kaldırıldı |
| Gerilim Optimizasyonu | Yayından kaldırıldı |
| GT RC6 | Yayından kaldırıldı |
| Gfx Düşük Güç Modu | Yayından kaldırıldı |
| SA GV | Yayından kaldırıldı |
| Agresif LPM Desteği | Yayından kaldırıldı |
| ACPI S3 Desteği | Yayından kaldırıldı |
| Yerel ASPM | Yayından kaldırıldı |
Notlar, referanslar ve destekleyici materyaller
RT modunu mümkün kılan kavramları, alt sistemleri ve değişiklikleri (düzen, planlayıcılar ve mimari detaylar dahil) daha derinlemesine incelemek isterseniz, çok kapsamlı eğitim materyalleri bulacaksınız. Örneğin PREEMPT_RT'ye ayrılmış bu slaytlar sizin için çok faydalı olabilir.: PDF indir
Bazı dağıtımlar, derleme sistemlerinde önceden oluşturulmuş RT ikili dosyaları veya entegrasyonlar sunar. Sıfırdan derleme yapmadan değerlendirme yapmak ve sonuçları kendi özel çekirdeğinizle karşılaştırmak için iyi bir başlangıç noktasıdır..
Sıkça sorulan sorular: aktivasyon, dağıtımlar ve çekirdek argümanları
6.12'nin gelişiyle birlikte PREEMPT_RT seçeneği çeşitli mimariler için ana çekirdeğe entegre edildi. Varsayılan olarak etkin olup olmadığı dağıtıma bağlıdır: bazıları ayrı RT varyantlarını korur, bazıları özel paketler sunar ve bazıları da bunu özel sürümler için bırakır.Dağıtımınızın sürüm notlarını her zaman kontrol edin ve eğer "linux-image-rt" veya benzeri bir şey varsa, başlamak için önerilen yol budur.
Çekirdek argümanı "preempt=full" ile ilgili olarak: PREEMPT_RT ile aynı değildir ve etkisi derlenmiş yapılandırmaya bağlıdır. Son çekirdeklerde (örneğin 6.10.6 ve üzeri) `preempt=full` parametresini geçirmek sisteminizi başlatmıyorsa, bu parametreyi kaldırın ve gerçek çekirdek yapılandırmasını kontrol edin.Kesin gerçek zamanlılık için, CONFIG_PREEMPT_RT'yi etkinleştirmeniz/yapılandırmanız veya dağıtımınız için RT çekirdeğini yüklemeniz gerekir.
/sys/kernel/realtime'ın 1 olduğundan ve uname'in PREEMPT_RT'yi gösterdiğinden emin olun. "Düşük gecikme" beklentilerini "gerçek zaman" ile karıştırmaktan kaçının; bunlar farklı hedeflere sahip farklı profillerdir.Sert RT'ye ihtiyacınız varsa, önyükleyicideki agresif argümanlara dokunmadan önce kararlı bir RT çekirdeğine ve tanılama araçlarına (cyclictest/rtla) öncelik verin.
Günümüzde gerçek zamanlı bir Linux sistemi kurmak, PREEMPT_RT'nin ana hatta gelmesiyle daha kolay hale geldi; çünkü size saatler kazandıracak paketler, tarifler ve betikler mevcut. Öncelikle RT ikili dosyalarının mevcut olduğu yerleri doğrulayın, cyclest/rtla ile ölçüm yapın, gecikmeye zarar veren hata ayıklama seçeneklerini devre dışı bırakın, öncelikleri/IRQ'ları ayarlayın ve iş yükünüz gerektirdiğinde CPU'ları izole edin.Derleme yapıyorsanız, .deb dosyaları oluşturan ve RT çalışması için kullanıcı sınırları belirleyen betikler kullanın; NVIDIA GPU kullanıyorsanız, IGNORE_PREEMPT_RT_PRESENCE değişkenini unutmayın. Ayrıca, durumunuz kesin sanallaştırma gerektiriyorsa, NVMe+SATA'lı bir NUC üzerinde özel geçişli ACRN, kullanıma hazır bir RTVM için sağlam bir temel oluşturur.