إذا كنت تعمل مع أنظمة حيث يكون وقت الاستجابة هو كل شيء، فإن PREEMPT_RT هو المكون الذي يحول نظام Linux "العادي" إلى نظام جاهز للوقت الفعلي. نحن نتحدث عن أوقات الانتظار التي يتم التحكم فيها، والجداول الزمنية ذات الأولوية الصارمة، وأدوات التحليل التي تسمح بالضبط الدقيق حتى آخر ميكروثانية.في ملف البرنامج التعليمي هذا سوف تجد، بطريقة منظمة بشكل جيد، ما هو PREEMPT_RT، وحالته في النواة، وكيفية تثبيته أو تجميعه، وكيفية قياسه وتحسينه، وحتى كيفية إعداده في VM في الوقت الفعلي مع ACRN.
بالإضافة إلى النظرية، أقدم لك تعليمات عملية مدعومة بنصوص برمجية تعمل على أتمتة تجميع نوى RT، والحزم الجاهزة للاستخدام في التوزيعات الشائعة، ووصفات Yocto. ستتعرف أيضًا على كيفية التحقق من تشغيل النظام في وضع RT، وخيارات kernel التي يجب تعطيلها لتجنب ارتفاعات زمن الوصول، وكيفية ضبط IRQs وCPU والخدمات.لقد قمنا أيضًا بتغطية توافق برنامج تشغيل NVIDIA في بيئات PREEMPT_RT وحالة واقعية مع Clear Linux على Intel NUC المصمم للمهام المهمة.
ما هو PREEMPT_RT وأين يقع في النواة؟
تم إنشاء PREEMPT_RT كسلسلة من التصحيحات التي تعمل على تحويل Linux إلى نظام يعمل في الوقت الفعلي، بهدف تقليل زمن الوصول وضمان القدرة على التنبؤ. بدأ المشروع في عام 2005 تحت مظلة Realtime-Preempt (-rt)، وانتقل إلى مؤسسة Linux في عام 2015 وكان له دور رئيسي في قطاعات مثل التمويل والصوت والفيديو الاحترافي والطيران والطب والروبوتات والاتصالات والأتمتة الصناعية..
منذ عام 2019، تمت ترقية الكود الخاص به نحو النواة الرئيسية. تتيح سلسلة 6.12 إمكانية التكوين في الوقت الفعلي في النواة الرئيسية لـ x86 وARM64 وRISC-V، والتي تم فتحها بعد دمج مكونات printk المهمة ودعم وحدة التحكم الذرية.يحتوي وحدة التحكم UART 8250 على وحدة تحكم ذرية، في حين أن البنى الأخرى مثل ARM وPOWERPC لا تزال تتطلب دمج الأجزاء الأساسية، لذلك قد يصل دعمها الكامل في وقت لاحق إلى حد ما إذا لم يتم تضمين كل شيء في الوقت المناسب.
على الرغم من أن الدعم الأساسي ينتهي في الإصدار 6.12، فإن المطورين يوصون باتباع أحدث تصحيحات PREEMPT_RT في قائمة انتظار RT عند البحث عن أفضل أداء (الهندسة المعمارية الجديدة، والتعديلات على الرسومات المتسارعة، والتحسينات التي تصل دائمًا أولاً في قائمة انتظار التصحيحات). في بيئات الإنتاج، يُنصح باستخدام أحدث إصدار مستقر من شجرة RT..
مفهوميًا، التغيير الرئيسي هو القدرة على استباق أي جزء من نواة النظام تقريبًا، مما يؤدي إلى تقليل النوافذ غير القابلة للانقطاع. يؤدي هذا إلى اهتزاز أقل واستجابات أكثر قابلية للتنبؤ مقارنة بالنواة العامة، وهو أمر لا غنى عنه عندما لا يمكن للمهمة الانتظار.

تكوين النواة الأساسي في الوقت الفعلي
الإعداد الرئيسي هو تمكين النواة القابلة للقطع بالكامل: CONFIG_PREEMPT_RT. في النوى الحديثة، يظهر هذا الخيار ضمن "الإعداد العام"، وإذا لم تتمكن من رؤيته، فإن تمكين CONFIG_EXPERT عادةً ما يكشف عن الخيار.في الإصدارات السابقة، ربما كان PREEMPT_RT موجودًا داخل قائمة "نموذج الاستباق".
توجد إعدادات شائعة موجهة نحو التصحيح تؤدي إلى زيادة زمن الوصول ويجب تعطيلها عندما تبحث عن الأداء في الوقت الفعلي. أمثلة نموذجية يجب تجنبها: DEBUG_LOCKDEP، وDEBUG_PREEMPT، وDEBUG_OBJECTS، وSLUB_DEBUGإذا بدأت بملف .config الخاص بالتوزيع، فمن المحتمل أن يكون أحد هذه الملفات نشطًا؛ لذا قم بفحصه وتنظيفه لتقليل التذبذب.
لا يختلف إنشاء وتشغيل نواة باستخدام PREEMPT_RT كثيرًا عن نواة قياسية، باستثناء الخيارات المذكورة أعلاه. لاحظ أن بعض أدوات البناء تتغير بشكل طفيف بدءًا من Linux 6.x، وقد تتطلب بعض الخطوات حزمًا إضافية. (سوف تشاهد التفاصيل العملية أدناه أثناء التجميع التلقائي).
التثبيت السريع على التوزيعات والتحقق من وضع RT
التثبيت على دبيان:
sudo apt-get install linux-image-rt-amd64
يحتوي Yocto على وصفة محددة لنواة RT وصورة أخرى تستخدمها بشكل افتراضي. يتم عادةً تعيين موفر kernel في local.conf أو bblayers.conf أو $MACHINE.conf:
مثال يوكتو:
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-rt"
إذا قمت بإعداد BSP الذي يريد استخدام linux-yocto-rt بشكل افتراضي، فقم أيضًا بإضافة هذا الإعداد إلى bbappend لـ linux-yocto-rt: يؤدي هذا إلى الحد من الدعم لجهازك ومنع حدوث مشكلات التوافق غير المرغوب فيها.:
مثال bbappend:
COMPATIBLE_MACHINE:$MACHINE = $MACHINE
بعد بدء التشغيل، تأكد من أنك في الوقت الحقيقي فعليًا. ابحث عن مؤشر PREEMPT_RT في uname وتحقق من صحة /sys/kernel/realtime:
التحقق من وضع RT:
uname -a
cat /sys/kernel/realtime # debe devolver 1
هناك نقطة مهمة أخرى وهي وقت وحدة المعالجة المركزية المخصص للمهام غير المتعلقة بوقت العمل الحقيقي، والذي يمنع بشكل افتراضي مؤشر ترابط الوقت الحقيقي من حظر النظام. قم بضبط الحد العالمي SCHED_FIFO/SCHED_RR بالمايكروثانية أو قم بتعطيله إذا كنت تعرف ما تفعله.:
إعداد وقت 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
التجميع والنشر الآلي باستخدام البرامج النصية
إذا كنت تفضل تجميع وتثبيت نواة RT، فهناك نصوص برمجية تقوم بذلك تلقائيًا تقريبًا، بما في ذلك تحديد الإصدار والدعم الإضافي (Docker، وNVIDIA، وما إلى ذلك). يبدأ التدفق النموذجي بتحديد النواة الحالية لديك لاختيار إصدار RT القريب:
اكتشف الإصدار الخاص بك:
uname -r # por ejemplo: 5.15.XX-generic → elegir 5.15.XX-rt-YY o lo más próximo
مثال على استخدام مستودع يحتوي على نصوص برمجية لتجميع PREEMPT_RT وتثبيته بطريقة موجهة على Debian/Ubuntu، داخل مساحة عمل محلية. تعمل هذه الخطوات على أتمتة التبعيات وتنزيلات المصدر والتعبئة.:
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
أثناء التنفيذ، سيكون بإمكانك اختيار إصدار kernel ووضع التثبيت (Debian). إذا فشل البناء، تحقق من ملف .config وقم بتعديله؛ في بعض إصدارات 6.1.x، على سبيل المثال، كان من الضروري إضافة حزم وتغيير هدف البناء.:
# 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
بعد التثبيت، قم بإنشاء مجموعة لأذونات RT وأضف المستخدم الخاص بك. يتيح لك هذا تعيين الأولويات وقفل الذاكرة دون الحاجة إلى امتيازات الجذر لجميع الأوامر.:
sudo addgroup realtime
sudo usermod -a -G realtime $(whoami)
قم بتكوين الحدود في /etc/security/limits.conf بحيث يكون للأعضاء "الوقت الحقيقي" الأولوية المناسبة وقفل الذاكرة. يمنع هذا الإعداد حالات فشل حدود المستخدم عن طريق رفع الأولويات أو حظر الذاكرة:
# 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
إذا حصلت على أخطاء الرؤوس المفقودة بعد تثبيت kernel، فتحقق من /usr/src، وإذا لزم الأمر، قم بتثبيت حزمة الرؤوس المقابلة. من المهم اختيار حزمة RT الصحيحة:
cd /ruta/donde/compilaste/el/kernel
sudo dpkg -i linux-headers-*<TAB TAB> # elige el que termine en -rt
بالنسبة لبرامج تشغيل NVIDIA على RT، يمكنك فرض التثبيت عن طريق تجاهل اكتشاف PREEMPT_RT. يجعل هذا من الأسهل على DKMS تجميع الوحدات النمطية على نواة الوقت الفعلي:
export IGNORE_PREEMPT_RT_PRESENCE=1
sudo -E apt-get install nvidia-driver-XXX # p.ej. XXX=535
إذا تم تثبيت برنامج التشغيل بالفعل قبل تصحيح RT، فقم بتثبيت الوحدة يدويًا للإصدار والنواة لديك. تأكد من أنك تشير إلى رقم إصدار برنامج التشغيل الصحيح و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
أدوات التقييم: cyclictest، timerlat، والمزيد
لقياس جودة RT، الأداة الكلاسيكية هي cyclictest، وهي جزء من حزمة rt-tests، المتوفرة في معظم توزيعات Windows. في Debian/derivatives يكون التثبيت مباشرًا:
sudo apt-get install rt-tests
يقوم مثال الاختبار بتشغيل خيط واحد لكل وحدة معالجة مركزية باستخدام SCHED_FIFO 98، بفاصل زمني 250 ميكروثانية، ويُظهر أوقات الاستجابة بالمايكروثانية. يحاكي هذا النمط تحميل RT الدوري لاكتشاف الارتفاعات والتذبذبات:
sudo cyclictest -S -m -p98 -i250
في الوقت الفعلي، يتم استخدام فئتين للجدولة: SCHED_FIFO وSCHED_RR. يتم تنفيذ FIFO بأولوية ثابتة (1..99) حتى يتم تحرير وحدة المعالجة المركزية أو وصول مؤشر ترابط ذي أولوية أعلى؛ يقسم RR الوقت عندما تكون هناك مؤشرات ترابط متعددة بنفس الأولويةيؤدي اختيار الفئة الصحيحة إلى إحداث فرق واضح في طوابير العمل ذات زمن الوصول المنخفض.
تتضمن النواة أدوات تتبع تساعد في تشخيص أوقات استيقاظ النظام. يتيح لك متتبع timerlat وأداة مساحة مستخدم rtla عرض وربط التأخيرات في IRQs وخيوط kernel وخيوط المستخدم.حالة الاستخدام النموذجية، التي تتوقف تلقائيًا في حالة تجاوز حد معين، ستكون:
الاستخدام النموذجي لـ rtla:
sudo rtla timerlat top -a 4000 -Pf:98
# ... al superar 4000 µs detiene el tracing y muestra posibles causas
يحافظ مجتمع OSADL على تصحيحات مفيدة لتقييم أوقات الاستجابة باستخدام المخططات البيانية في النواة نفسها. من خلال debugfs، يمكنك قراءة الحد الأقصى لوحدة المعالجة المركزية ومعرفة المهمة التي كانت متورطة في أكبر تأخير:
الرسم البياني للزمن الكامن:
cd /sys/kernel/debug/latency_hist/timerandwakeup
cat max_latency-CPU*
ملاحظة عملية: في بعض توزيعات النظام، توجد خدمات نظام (على سبيل المثال، بعض NTP) تبدأ بأولوية RT ويمكن أن تتداخل مع مؤشرات الترابط الهامة لديك. قم بتشغيل top/ps مرتبة حسب الأولوية لتحديد العمليات ذات SCHED_FIFO/RR النشطة وإعادة التعديل إذا لزم الأمر.
ضبط النظام: المقاطعات والأولويات وعزل النواة
بشكل افتراضي، يتم تشغيل مؤشرات الترابط المقاطعة باستخدام SCHED_FIFO عند الأولوية 50. يمكنك رفع أولويات طلبات المقاطعة الحرجة (على سبيل المثال، من بطاقة NIC) والتنسيق مع NAPI لتقليل زمن انتقال الشبكة.:
مثال على إعدادات 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
لتخصيص النوى بأكملها لأحمال عمل RT، يمكنك عزل وحدات المعالجة المركزية عن المجدول العام ومسار المقاطعة. تساعد معلمات النواة هذه في سطر التمهيد على تقليل التداخل من مهام النظام:
isolcpus=2,3 rcu_nocbs=2,3 nohz_full=2,3 irqaffinity=0
تعيين تقارب IRQ:
echo 4 | sudo tee /proc/irq/<irq_number>/smp_affinity
للتحقق من النتائج، كرر الاختبارات باستخدام cyclictest/rtla وتأكد من أن قوائم انتظار التطبيق لديك وطلبات المقاطعة المرتبطة بها تتواجد مع الحد الأدنى من التنافس. تذكر أنه ستكون هناك دائمًا مهام إدارية معينة سيبقيها النظام خارج سيطرتك بنسبة 100%..
نشر جهاز افتراضي في الوقت الفعلي باستخدام ACRN (مسح Linux على Intel NUC)
إمكانية أخرى هي تشغيل ضيف Linux في الوقت الفعلي على المشرف الافتراضي ACRN. بالنسبة لجهاز RTVM (آلة افتراضية في الوقت الفعلي)، فأنت بحاجة إلى أن تكون أجهزة المرور الخاصة به مخصصة وتحت وحدات تحكم PCI مختلفة عن تلك الموجودة في نظام تشغيل الخدمة (SOS).تعتبر وحدة Intel KBL NUC (مثل NUC7ixDNHE) عملية للغاية لأنها تحتوي على محركات NVMe و SATA منفصلة.
سيكون أحد أمثلة سير العمل هو: تثبيت Clear Linux (v29400) على كل من محركات NVMe وSATA؛ وتكوين محرك SATA كـ SOS وإضافة المشرف الافتراضي إلى قسم EFI. بعد ذلك، قم بإعداد وتشغيل ضيف RT على NVMe باستخدام الحزم والوحدات النمطية المناسبة..
الخطوات العملية: أضف حزمة kernel-lts2018-preempt-rt، وانسخ وحدة preempt-rt إلى قرص NVMe، واسترد معرفات PCI للعبور (على سبيل المثال، [01:00.0] و[8086:f1a6]). قم بتعديل البرنامج النصي launch_hard_rt_vm.sh لنقل NVMe إلى الضيف وتكوين الشبكة وفقًا لاحتياجاتك.:
خيارات الشبكة:
# Opción 1: virtio-net
# Opción 2: passthrough de una NIC PCIe
قم بتشغيل VM في الوقت الفعلي وتحقق من kernel باستخدام uname -a داخل الضيف. بمجرد التشغيل، قم بتثبيت rt-tests وتشغيل cyclictest للتحقق من صحة السلوك:
sudo cyclictest -S -m -p98 -i250
لمزيد من التحسين، قم بتعديل BIOS/UEFI عن طريق تعطيل التقنيات التي توفر الطاقة ولكنها تسبب زمن انتقال، وتمكين إمكانيات المحاكاة الافتراضية. سيتضمن دليل مرجع BIOS للأنظمة الأساسية من هذا النوع شيئًا مثل هذا:
| بند | محيط |
|---|---|
| VMX | يمكن لمستخدمي تطبيق Smart Spaces مع Google Wallet الاستفادة من دخول محمول دون لمس مع أي قارئ HID® Signo™ مُمكَّن بتقنية NFC. |
| VT-د | يمكن لمستخدمي تطبيق Smart Spaces مع Google Wallet الاستفادة من دخول محمول دون لمس مع أي قارئ HID® Signo™ مُمكَّن بتقنية NFC. |
| الترابط | معاق |
| خطوة السرعة | معاق |
| تحول السرعة | معاق |
| ولاية كاليفورنيا | معاق |
| تحسين الجهد | معاق |
| جي تي ار سي 6 | معاق |
| وضع الطاقة المنخفضة في Gfx | معاق |
| SA GV | معاق |
| دعم LPM العدواني | معاق |
| دعم ACPI S3 | معاق |
| ASPM الأصلي | معاق |
الملاحظات والمراجع والمواد الداعمة
إذا كنت تريد التعمق أكثر في المفاهيم والأنظمة الفرعية والتغييرات التي تمكن وضع RT (بما في ذلك التخطيط والمخططين والتفاصيل المعمارية)، فستجد مواد تدريبية شاملة للغاية. على سبيل المثال، قد تكون هذه الشرائح المخصصة لـ PREEMPT_RT مفيدة جدًا لك.: PDF
توفر بعض التوزيعات ثنائيات RT جاهزة أو تكاملات في أنظمة البناء الخاصة بها. إنها نقطة بداية جيدة للتقييم دون التجميع من الصفر ومقارنة النتائج مع نواة النظام المخصصة لديك..
الأسئلة الشائعة: التنشيط، والتوزيعات، وحجج النواة
مع وصول 6.12، تم دمج خيار PREEMPT_RT في النواة الرئيسية للعديد من المعماريات. يعتمد تمكينه افتراضيًا على التوزيع: فبعضها يحتفظ بإصدارات RT منفصلة، والبعض الآخر يقدم حزمًا محددة، والبعض الآخر يتركها للإصدارات المخصصة.تحقق دائمًا من ملاحظات إصدار التوزيعة الخاصة بك، وإذا كان هناك "linux-image-rt" أو ما شابه، فهذه هي الطريقة الموصى بها للبدء.
بخصوص وسيطة kernel "preempt=full": فهي لا تعادل PREEMPT_RT ويعتمد تأثيرها على التكوين المترجم. إذا لم يؤدِ تمرير `preempt=full` في النوى الحديثة (على سبيل المثال، من 6.10.6 فصاعدًا) إلى تشغيل نظامك، فقم بإزالة هذه المعلمة وتحقق من تكوين النواة الفعلي.بالنسبة للوقت الحقيقي الصارم، فإن الطريقة هي تمكين/تكوين CONFIG_PREEMPT_RT أو تثبيت نواة RT لتوزيعك.
تأكد دائمًا من أن /sys/kernel/realtime يساوي 1 وأن uname يعرض PREEMPT_RT. تجنب خلط توقعات "الزمن المنخفض" مع "الوقت الحقيقي"؛ فهي ملفات تعريف منفصلة لها أهداف مختلفة.إذا كنت بحاجة إلى RT صعب، فقم بإعطاء الأولوية لنواة RT مستقرة وأدوات التشخيص (cyclictest/rtla) قبل لمس الحجج العدوانية في أداة تحميل التشغيل.
أصبحت عملية إعداد نظام Linux في الوقت الفعلي اليوم أكثر سهولة بفضل وصول PREEMPT_RT إلى الخط الرئيسي، حيث توجد حزم ووصفات ونصوص برمجية توفر عليك ساعات من الوقت. ابدأ بالتحقق من صحة الثنائيات RT حيثما وجدت، وقم بالقياس باستخدام cyclictest/rtla، وقم بتعطيل خيارات التصحيح التي تضر بالزمن، واضبط الأولويات/IRQs، وقم بعزل وحدات المعالجة المركزية عندما يتطلب عبء العمل ذلك.إذا كنت تقوم بالتجميع، فاستخدم نصوصًا برمجية تُنشئ ملفات .deb وتضع حدودًا للمستخدمين لعمل RT؛ إذا كنت تستخدم وحدة معالجة رسومات NVIDIA، فتذكر متغير IGNORE_PREEMPT_RT_PRESENCE. وإذا كانت حالتك تتطلب محاكاة افتراضية حتمية، فإن ACRN مع مرور مخصص على وحدة NUC مزودة بـ NVMe+SATA يُعد أساسًا متينًا لـ RTVM يستجيب فورًا.