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

This will start the latency test with a base-thread period of 25 µs and a servo-thread period of 1 ms. The period times may be specified on the command line:

latency-test 50000 1000000

This will start the latency test with a base-thread period of 50 µs and a servo-thread period of 1 ms.

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.

In the example above, latency-test only ran for a few seconds. You should run the test for at least several minutes; sometimes the worst case latency doesn’t happen very often, or only happens when you do some particular action. For instance, one Intel motherboard worked pretty well most of the time, but every 64 seconds it had a very bad 300 µs latency. Fortunately that was fixable, see https://wiki.linuxcnc.org/cgi-bin/wiki.pl?FixingSMIIssues .

So, what do the results mean? If your Max Jitter number is less than about 15-20 microseconds (15000-20000 nanoseconds), the computer should give very nice results with software stepping. If the max latency is more like 30-50 microseconds, you can still get good results, but your maximum step rate might be a little disappointing, especially if you use microstepping or have very fine pitch leadscrews. If the numbers are 100 µs or more, i.e. >= 100,000 nanoseconds (ns), then the PC is not a good candidate for software stepping. Numbers over 1 millisecond (1,000,000 ns) mean the PC is not a good candidate for LinuxCNC, regardless of whether you use software stepping or not.

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.

Tipp
Zusätzliche Kommandozeilen-Tools sind für die Untersuchung der Latenz verfügbar wenn LinuxCNC nicht läuft.

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]

Optionen:
      --base ns  (base  thread interval in nanoseconds, default:   25000)
      --servo ns (servo thread interval in nanoseconds, default: 1000000)
      --time ms  (report interval in milliseconds, default: 1000)
      --relative (relative clock time (default))
      --actual   (actual clock time)
Latenz-Plot Fenster
Abbildung 2. latency-plot-Fenster

2.3. Latenz-Histogramm

Die Anwendung 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 in Nanosekunden, Voreinstellung: 25000, min: 5000)
  --servo ns (Servo-Thread-Intervall in Nanosekunden, Voreinstellung: 1000000, Mindestwert: 25000)
  --bbinsize ns (Basis-Bin-Größe in Nanosekunden, Voreinstellung: 100
  --sbinsize ns (Servo-Bin-Größe in Nanosekunden, 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)

Note: When determining the latency, 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.