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.
Generating step pulses in software has one very big advantage - it’s free. Just about every PC that has a parallel port is capable of outputting step pulses that are generated by the software.
However, software step pulses also have some disadvantages:
-
begrenzte maximale Schrittfrequenz
-
Jitter (variierende zeitliche Abstände) in den erzeugten Impulsen
-
belastet die CPU
2. Latenz-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
The latency test can be run a few different ways.
If you are using PnCconf to configure your machine, you can launch the Latency Test by clicking the "Test Base Period Jitter button' during the 2nd step of the process.
If you are using StepConf to configure your machine, you can launch the Latency Test by clicking the "Test Base Period Jitter button' during the 2nd step of the process.
If you want to run the test from the command line, open a terminal window (in Ubuntu, from Applications → Accessories → Terminal) and run the following command:
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:
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 [_latency_tuning].
So, what do the results mean?
If your Max Jitter number is less than about 20,000 nanoseconds, the computer should give very nice results with software stepping or a dedicated hardware card such as a Mesa Anything I/O card.
If the Max Jitter number is between 20,000 and 50,000 nanoseconds, you can still get good results with software stepping, but your maximum step rate might be a little disappointing, especially if you use microstepping or have very fine pitch leadscrews. You can, however, achieve excellent results using a hardware card.
If the Max Jitter number is between 50,000 and 500,000 nanoseconds, you cannot use software stepping. You can, however, achieve acceptable results using a hardware card.
If the Max Jitter number is above 500,000 nanoseconds, you cannot use software stepping or a hardware card with LinuxCNC and achieve acceptable results.
|
Anmerkung
|
If you get high numbers, there may be ways to improve them. Another PC had very bad latency (several million nanoseconds) when using the onboard video. But a $5 used video card solved the problem. LinuxCNC does not require bleeding-edge 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)
latency-plot-Fenster2.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)
|
Anmerkung
|
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 the +/- bin range are reported with special end bars. Use --show to show count for the off-chart [pos|neg] bin. |
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.
-