Einrichten von Ubuntu Linux 22.04 für Echtzeitleistung mit EtherCAT

Ubuntu 22.04 enthält jetzt einen Echtzeit-Linux-Kernel basierend auf Kernel v5.15 mit dem PREEMPT-RT-Patch. Wir sehen uns an, wie einfach es ist, diesen Echtzeit-Linux-Kernel hinzuzufügen, und testen dann die Leistung für EtherCAT-Anwendungen.

28. Februar 2023 8:00 Uhr

Ubuntu 22.04 Real-time Linux

Einführung

Die Qualität der EtherCAT-Kommunikation hängt stark von der Genauigkeit des EtherCAT-Zyklus ab. Ein hoher Jitter in der Zykluszeit hat einen negativen Einfluss auf die Prozessdatenübertragung. Für anspruchsvolle EtherCAT-Anwendungen mit schnellen Zykluszeiten sind die Echtzeitanforderungen noch wichtiger, und daher ist auf einem Multitasking-Betriebssystem (OS) wie Linux zusätzlicher Aufwand erforderlich, um das Echtzeitverhalten zu verbessern. Für einige einfache Anwendungsfälle ist die Standard-Out-of-the-Box"-Linux-Umgebung ausreichend, aber die Mehrheit der EtherCAT-Anwendungen hat normalerweise strengere Echtzeitanforderungen. Die gängigste und am weitesten verbreitete Lösung zur Verbesserung des Echtzeitverhaltens eines Linux-basierten Systems ist die Anwendung eines Patches auf den Kernel, bekannt als PREEMPT_RT-Patch. Den PREEMPT_RT-Patch gibt es schon seit langem, und bis vor kurzem konnte es schwierig sein, ihn richtig zu implementieren, und er erforderte fortgeschrittene Kenntnisse über Linux-Kernel und Betriebssysteme im Allgemeinen. Glücklicherweise ist es seit April 2022 möglich, einen vorgefertigten Echtzeit-Linux-Kernel zu verwenden, auf den der PREEMPT_RT-Patch bereits angewendet wurde - dank der Veröffentlichung von Ubuntu 22.04 LTS https://ubuntu.com/blog/real-time-linux-qa.

Wir von acontis haben diese neue Version von Ubuntu und den darin enthaltenen Echtzeit-Linux-Kernel bereits getestet und möchten nun unsere Ergebnisse mit Ihnen teilen.

Den neuen Echtzeit-Kernel erhalten

Um den Echtzeit-Kernel unter Ubuntu 22.04 zu installieren, folgen Sie einfach den Anweisungen auf der Ubuntu-Website: https://ubuntu.com/blog/real-time-ubuntu-released. Zuvor in der Beta-Phase, hat Canonical kürzlich die 22.04-Version allgemein verfügbar gemacht: https://ubuntu.com/blog/real-time-ubuntu-is-now-generally-available. Um den Echtzeit-Kernel zu aktivieren, stehen zwei Optionen zur Verfügung: Ubuntu Server 22.04 LTS über Ubuntu Pro und Ubuntu Core 22 mit einem App Store. Ein Abonnement für Ubuntu Pro ist für den persönlichen Gebrauch kostenlos, aber für Ihre speziellen Bedürfnisse empfehlen wir Ihnen, sich mit Canonical in Verbindung zu setzen, um Ihre Lizenzierungsoptionen zu erfragen.

Nachdem Sie den Rechner mit einem Ubuntu Pro-Abonnement verbunden haben, kann der Echtzeit-Kernel mit einem einfachen Befehl aktiviert werden:

pro enable realtime-kernel

Überlegungen zur Optimierung

Für eine bessere Echtzeitleistung empfehlen wir dringend, die Firmware und das BIOS gemäß unseren Empfehlungen in unserem Developer Center einzurichten: https://developer.acontis.com/rt-faq/items/FAQ1013.html und https://developer.acontis.com/pcob.html.

Die obigen Empfehlungen dienen der grundlegenden Einrichtung und Vorbereitung des Systems.

Weitere Optimierungen können mit den Kernel-Parametern vorgenommen werden. Die Kernel-Parameter bieten eine Vielzahl von Möglichkeiten zur Feinabstimmung des Betriebssystems. Eine vollständige Liste der Kernel-Befehlszeilenparameter finden Sie hier: https://www.kernel.org/doc/html/v5.15/admin-guide/kernel-parameters.html.

Kernel-Parameter

Für unsere Zwecke können wir uns auf einige wenige Kernel-Parameter beschränken:

  1. 1. “Power and clocking management” Gruppe:
      • cpuidle.off=1
      • intel_idle.max_cstate=0
      • cpufreq.off=1
      • processor.max_cstate=0
      • processor_idle.max_cstate=0
      • intel_pstate=disable
      • rcupdate.rcu_cpu_stall_suppress=1
      • idle=poll
  2. 2. “Core isolation” Gruppe:
      • nohz_full=3
      • isolcpus=3
      • rcu_nocbs=3
      • irqaffinity=0
  3. 3. “Graphics Settings” Gruppe:
      • i915.enable_rc6=0
      • i915.enable_dc=0
      • i915.disable_power_well=0
      • i915.enable_guc=2

Die Hauptidee bei den Kernel-Parametern besteht darin, diese Parameter zu kombinieren und zu mischen, um je nach Anwendungsfall die besten Ergebnisse zu erzielen.

Voraussetzungen

  • Hardware: Intel® Core™ i5-8279U CPU 2.40GHz, 16Gb RAM, Intel I225-V Ethernet Controller
  • Ubuntu 22.04 LTS mit Echtzeit-Kernel 5.15
  • EtherCAT Master Software EC-Master 3.1.4 für Linux (kostenlose Evaluierung hier)

Testläufe

Wir werden die tatsächliche Zykluszeit der EcMaster Demo-Beispielanwendung mit Hilfe der in EC-Master integrierten Leistungsmessungsfunktion messen. Wenn diese Leistungsmessung aktiviert ist, gibt die EcMaster Demo-Anwendung regelmäßig die gemessenen Minimal-, Durchschnitts- und Maximalwerte für eine Reihe wichtiger Messungen aus, darunter auch die Zykluszeit. Unten sehen Sie einen Beispielauszug aus der Ausgabe dieser Leistungsmessungsfunktion. Für unsere Zwecke ist der kritische Wert die oberste Zeile, die die Gesamtzykluszeit anzeigt. In der untenstehenden Beispielausgabe bedeutet der maximale Zykluszeitwert von 1053,5 Mikrosekunden einen Jitter im ungünstigsten Fall von 53,5 Mikrosekunden:

0001363481: ===========================================================
0001363481: PerfMsmt 'Cycle Time                                          ' (min/avg/max) [usec]: 948.3/1000.0/1053.5
0001363481: PerfMsmt 'Task Duration (JOB_Total + App)    ' (min/avg/max) [usec]:      7.4/    12.2/    77.0
0001363481: PerfMsmt 'JOB_Total                                            ' (min/avg/max) [usec]:      7.0/    11.4/    67.5
0001363481: PerfMsmt 'JOB_ProcessAllRxFrames Duration' (min/avg/max) [usec]:      1.3/      3.4/    46.2
0001363481: PerfMsmt 'JOB_SendAllCycFrames Duration   ' (min/avg/max) [usec]:      3.0/      3.9/    41.5
0001363481: PerfMsmt 'JOB_MasterTimer Duration             ' (min/avg/max) [usec]:      0.4/      1.5/    37.9
0001363481: PerfMsmt 'JOB_SendAcycFrames Duration      ' (min/avg/max) [usec]:      1.5/      2.4/    36.9
0001363481: PerfMsmt 'myAppWorkPd                                   ' (min/avg/max) [usec]:      0.0/      0.2/    27.9

Um eine Belastung des Systems zu simulieren, verwenden wir den BurnInTest v5.0 für Linux (http://www.passmark.com/products/bit.htm) mit den folgenden Einstellungen:

Jeder Test läuft mindestens 24 Stunden lang.

Die Anwendung wird isoliert auf Kern 3 ausgeführt, wobei der Befehlszeilenschalter "-a" aus der Beispielanwendung verwendet wird:

./EcMasterDemo –a 3 …

Nachfolgend finden Sie eine Zusammenfassung der Ergebnisse einiger Testläufe in der Tabelle. Wie Sie sehen können, ist es möglich, das Echtzeitverhalten eines vorkompilierten Linux-Kernels zu verbessern, indem nur Kernel-Parameter verwendet werden.

 

Beschreibung

Kernel parameters used

Cycle Time (µS)

Min.

Avg.

Max.

1

Ubuntu 22.04 LTS with real-time kernel 5.15.0-1028-realtime. *1Ubuntu 22.04 LTS with real-time kernel 5.15.0-1028-realtime. *1

default

643.4

1000.0

1359.5

2

Grundlegende Optimierungen, einschließlich Energie- und Taktmanagement und Kernisolierung

*2

558.2

1000.0

1443.8

3

Grundlegende Optimierungen mit mehr Kernisolierung

*3

751.0

1000.0

1254.4

4

Erweiterte Energie- und Taktoptimierungen mit zusätzlichen Optimierungen der Grafikeinstellungen

*4

938.0

1000.0

1061.9

Notes:
(*1) 2 hour test run
(*2) cpuidle.off=1 intel_idle.max_cstate=0 cpufreq.off=1 nohz_full=3 isolcpus=3
(*3) cpuidle.off=1 intel_idle.max_cstate=0 cpufreq.off=1 nohz_full=3 isolcpus=3 rcu_nocbs=3
(*4) cpuidle.off=1 intel_idle.max_cstate=0 cpufreq.off=1 processor_idle.max_cstate=0 processor.max_cstate=0 intel_pstate=disable nohz_full=3 isolcpus=3 rcu_nocbs=3 rcupdate.rcu_cpu_stall_suppress=1 i915.enable_rc6=0 i915.enable_dc=0 i915.disable_power_well=0 i915.enable_guc=2 nohz=off rcu_nocb_poll idle=poll irqaffinity=0

Fazit

Mit der Ubuntu-Version 22.04 ist es einfacher denn je, den Linux-Echtzeit-Kernel zu aktivieren. Für viele EtherCAT-Anwendungen ist das deterministische Verhalten, das ein Echtzeit-Betriebssystem (RTOS) bietet, für die Gesamtanwendung unerlässlich. Die aktuelle Implementierung in Ubuntu 22.04 ist ein großartiger erster Schritt und wird es Entwicklern wesentlich erleichtern, Echtzeitanwendungen zu erstellen und einzusetzen. Mit einigen einfachen Optimierungen der Kernelparameter kann die Echtzeitleistung mit minimalem Aufwand weiter verbessert werden.