1. Was bedeutet Latenz?

Die Latenz ist die Zeit, die der PC braucht, um seine reguläre Arbeit zu unterbrechen und auf eine externe Anfrage zu reagieren, z. B. das Ausführen eines der regelmäßigen Echtzeit-Threads von LinuxCNC. Je niedriger die Latenz, desto schneller können Sie die Echtzeit-Threads ausführen, und desto flüssiger wird die Bewegung (und möglicherweise schneller im Fall von Software-Stepping).

Die Latenzzeit ist viel wichtiger als die CPU-Geschwindigkeit. Ein bescheidener Pentium II, der auf Unterbrechungen jedes Mal innerhalb von 10 Mikrosekunden reagiert, kann bessere Ergebnisse liefern als das neueste und schnellste P4-Hyperthreading-Biest.

Die CPU ist nicht der einzige Faktor, der die Latenzzeit bestimmt. Motherboards, Grafikkarten, USB-Anschlüsse und eine Reihe anderer Dinge können die Latenz beeinträchtigen. Der beste Weg, um herauszufinden, womit Sie es zu tun haben, ist die Durchführung des Latenztests.

Die Erzeugung von Schrittimpulsen in der Software hat einen sehr großen Vorteil - sie ist kostenlos. So gut wie jeder PC verfügt über eine parallele Schnittstelle, die in der Lage ist, die von der Software erzeugten Schrittimpulse auszugeben. Die Software-Schrittimpulse haben jedoch auch einige Nachteile:

  • begrenzte maximale Schrittfrequenz

  • Jitter (variierende zeitliche Abstände) in den erzeugten Impulsen

  • belastet die CPU

2. Latency Tests

LinuxCNC enthält mehrere Latenz-Tests. Sie alle produzieren gleichwertige Informationen. Das Ausführen dieser Tests wird helfen, festzustellen, ob ein Computer für den Betrieb einer CNC-Maschine geeignet ist.

Anmerkung
Führen Sie LinuxCNC oder StepConf nicht aus, während der Latenztest läuft.

2.1. Latenz-Test

Um den Test auszuführen, öffnen Sie ein Terminal-Fenster (in Ubuntu, von Anwendungen → Zubehör → Terminal) und führen den folgenden Befehl aus:

latency-test

Damit wird der Latenztest mit einer Basis-Thread-Periode von 25 µs und einer Servo-Thread-Periode von 1 ms gestartet. Die Periodenzeiten können in der Befehlszeile angegeben werden:

latency-test 50000 1000000

Damit wird der Latenztest mit einer Basis-Thread-Periode von 50 µs und einer Servo-Thread-Periode von 1 ms gestartet.

Die verfügbaren Optionen können Sie in der Befehlszeile eingeben:

latency-test -h

Nach dem Starten eines Latenztests sollten Sie so etwas sehen:

HAL-Latenz-Test
Abbildung 1. HAL-Latenz-Test

Während der Test läuft, sollten Sie den Computer beschäftigen: Bewegen Sie die Fenster auf dem Bildschirm. Surfen Sie im Internet. Kopieren Sie einige große Dateien auf der Festplatte. Spielen Sie etwas Musik ab. Führen Sie ein OpenGL-Programm wie z. B. glxgears aus. Die Idee ist, den PC auf Herz und Nieren zu prüfen, während der Latenztest den schlimmsten Fall ermittelt.

Die wichtige Zahl für das Software-Stepping ist der "maximale Jitter" des Basis-Threads. Im obigen Beispiel sind das 6693 Nanosekunden (ns), oder 6,693 Mikrosekunden (µs). Notieren Sie diese Zahl und geben Sie sie in StepConf ein, wenn sie angefordert wird.

Im obigen Beispiel lief der Latenztest nur einige Sekunden lang. Sie sollten den Test mindestens mehrere Minuten lang durchführen; manchmal tritt die schlimmste Latenz nicht sehr oft auf oder nur, wenn Sie eine bestimmte Aktion durchführen. Eine Intel-Hauptplatine funktionierte beispielsweise die meiste Zeit recht gut, aber alle 64 Sekunden hatte sie eine sehr schlechte 300 µs-Latenz. Glücklicherweise war das behebbar, siehe https://wiki.linuxcnc.org/cgi-bin/wiki.pl?FixingSMIIssues

Was bedeuten also die Ergebnisse? Wenn Ihre Max-Jitter-Zahl weniger als 15-20 Mikrosekunden (15000-20000 Nanosekunden) beträgt, sollte der Computer mit Software-Stepping sehr gute Ergebnisse liefern. Wenn die maximale Latenzzeit eher bei 30-50 Mikrosekunden liegt, können Sie immer noch gute Ergebnisse erzielen, aber Ihre maximale Schrittrate könnte etwas enttäuschend sein, insbesondere wenn Sie Mikroschrittverfahren verwenden oder sehr feine Spindelsteigungen haben. Wenn die Zahlen 100 us oder mehr (100.000 Nanosekunden) betragen, ist der PC kein guter Kandidat für Software-Stepping. Zahlen über 1 Millisekunde (1.000.000 Nanosekunden) bedeuten, dass der PC ist kein guter Kandidat für LinuxCNC, unabhängig davon, ob Sie Software-Stepping verwenden oder nicht.

Anmerkung
Wenn Sie hohe Zahlen erhalten, gibt es möglicherweise Möglichkeiten, sie zu verbessern. Ein anderer PC hatte eine sehr schlechte Latenz (mehrere Millisekunden) bei der Verwendung des Onboard-Videos. Aber eine $ 5 gebrauchte Grafikkarte löste das Problem. LinuxCNC benötigt keine hochmoderne Hardware.

Weitere Informationen zum Stepper-Tuning finden Sie im Kapitel Stepper Tuning.

Additional command line tools are available for examining latency when LinuxCNC is not running.

2.2. Latency Plot

latency-plot erstellt ein Streifendiagramm für einen Basis- und einen Servo-Thread. Es kann nützlich sein, um Spitzen in der Latenz zu sehen, wenn andere Anwendungen gestartet oder verwendet werden. Verwendung:

latency-plot --help

Usage:
      latency-plot --help | -?
      latency-plot --hal [Options]

Options:
      --base nS  (base  thread interval, default:   25000)
      --servo nS (servo thread interval, default: 1000000)
      --time mS  (report interval, default: 1000)
      --relative (relative clock time (default))
      --actual   (actual clock time)
Latenz-Plot Fenster
Abbildung 2. latency-plot-Fenster

2.3. Latenz-Histogramm

latency-histogram zeigt ein Histogramm der Latenz (Jitter) für einen Basis- und einen Servo-Thread an.

Usage:
   latency-histogram --help | -?
   latency-histogram [Options]

Optionen:
  --base ns (Basisgewindeintervall, Voreinstellung: 25000, min: 5000)
  --servo ns (Servo-Thread-Intervall, Voreinstellung: 1000000, Mindestwert: 25000)
  --bbinsize ns (Basis-Bin-Größe, Voreinstellung: 100
  --sbinsize ns (Servo-Bin-Größe, Voreinstellung: 100)
  --bbins n (Basis-Bins, Voreinstellung: 200
  --sbins n (Servo-Bins, Voreinstellung: 200
  --logscale 0|1 (logarithmische Skala der y-Achse, Voreinstellung: 1)
  --text note (zusätzlicher Hinweis, Voreinstellung: "" )
  --show (zeigt die Anzahl der nicht angezeigten Bins)
  --nobase (nur Servo-Thread)
  --verbose (Fortschritt und Fehlersuche)
  --nox (keine Benutzeroberfläche, Anzeige von elapsed,min,max,sdev für jeden Thread)

Notes:
  LinuxCNC and HAL should not be running, stop with halrun -U.
  Large number of bins and/or small binsizes will slow updates.
  For single thread, specify --nobase (and options for servo thread).
  Measured latencies outside of the +/- bin range are reported
  with special end bars.  Use --show to show count for
  the off-chart [pos|neg] bin
Latenz-Histogramm-Fenster
Abbildung 3. Latenz-Histogramm-Fenster

3. Latenz-Tuning

LinuxCNC kann auf vielen verschiedenen Hardware-Plattformen und mit vielen verschiedenen Echtzeit-Kernel laufen, und sie alle können von Tuning für eine optimale Latenz profitieren.

Ein primäres Ziel bei der Abstimmung des Systems für LinuxCNC ist es, eine CPU für die ausschließliche Verwendung von LinuxCNCs Echtzeit-Tasks zu reservieren, so dass andere Tasks (sowohl Benutzerprogramme als auch Kernel-Threads) den Zugriff von LinuxCNC auf diese CPU nicht stören.

Wenn bestimmte Tuning-Optionen werden geglaubt, um universell hilfreich LinuxCNC tut diese Abstimmung automatisch beim Start, aber viele Tuning-Optionen sind maschinenspezifisch und kann nicht automatisch durchgeführt werden. Die Person, die LinuxCNC installiert, muss experimentell die optimale Abstimmung für ihr System zu bestimmen.

3.1. Optimieren des BIOS für die Latenz

PC-BIOSe unterscheiden sich stark in ihrem Latenzverhalten.

Das Tuning des BIOS ist mühsam, da Sie den Computer neu starten, eine kleine Änderung im BIOS vornehmen, Linux booten und den Latenztest (möglicherweise für eine lange Zeit) ausführen müssen, um zu sehen, welche Auswirkungen Ihre BIOS-Änderung hatte. Wiederholen Sie dann alle anderen BIOS-Einstellungen, die Sie ausprobieren möchten.

Da BIOS-Systeme alle unterschiedlich und nicht standardmäßig sind, ist die Bereitstellung einer detaillierten BIOS-Tuning-Anleitung nicht praktikabel. Im Allgemeinen sind einige Dinge, die Sie im BIOS versuchen sollten:

  • Deaktivieren Sie ACPI, APM und alle anderen Energiesparfunktionen. Dies schließt alles ein, was mit Stromsparen, Suspendieren, CPU-Ruhezuständen, CPU-Frequenzskalierung usw. zu tun hat.

  • Deaktivieren Sie den "Turbo"-Modus der CPU.

  • Deaktivieren Sie CPU-Hyperthreading.

  • Deaktivieren Sie den System Management Interrupt (SMI) (oder kontrollieren Sie ihn anderweitig).

  • Deaktivieren Sie alle Hardware, die Sie nicht verwenden wollen.

3.2. Optimieren von Preempt-RT für Latenz

Der Preempt-RT-Kernel kann vom Tuning profitieren, um die beste Latenz für LinuxCNC zu erreichen. Die Abstimmung kann über die Kernel-Befehlszeile, sysctl, und über Dateien in /proc und /sys erfolgen.

Einige Tuning-Parameter, die es zu beachten gilt:

Kernel-Befehlszeile

Einzelheiten hier: https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt

  • isolcpus: Verhindert, dass die meisten Nicht-LinuxCNC-Prozesse diese CPUs benutzen, so dass mehr CPU-Zeit für LinuxCNC zur Verfügung steht.

  • irqaffinity`: Wählen Sie, welche CPUs Interrupts bedienen, so dass die CPUs, die für LinuxCNC Echtzeit reserviert sind, diese Aufgabe nicht übernehmen müssen.

  • rcu_nocbs: Verhindert die Ausführung von RCU-Callbacks auf diesen CPUs.

  • rcu_nocb_poll: Suche nach RCU-Callbacks statt Sleep/Wake zu verwenden.

  • nohz_full: Deaktiviert den Takt auf diesen CPUs.

Sysctl

Einzelheiten hier: https://www.kernel.org/doc/html/latest/scheduler/sched-rt-group.html

  • sysctl.kernel.sched_rt_runtime_us: Setzen Sie diesen Wert auf -1, um die Begrenzung der Zeit aufzuheben, die Echtzeit-Tasks verwenden dürfen.