1. ¿Qué es latencia?

La latencia es cuánto tiempo le toma a la PC detener lo que esta haciendo y responder a una solicitud externa, como ejecutar uno de los hilos periódicos en tiempo real de LinuxCNC. Cuanto menor sea la latencia, más rápido se ejecutarán los hilos en tiempo real y más suave será el movimiento (y potencialmente más rápido, en caso de pasos por software).

La latencia es mucho más importante que la velocidad de la CPU. Un humilde Pentium II que responde siempre a las interrupciones en 10 us puede dar mejores resultados que una bestia más reciente y rápida de P4 Hyperthreading.

La CPU no es el único factor para determinar la latencia. Las placas base, tarjetas de video, puertos USB y un número de otros factores puede dañar la latencia. La mejor manera de averiguar con cuánta se esta tratando, es ejecutar la prueba de latencia.

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:

  • velocidad de paso máxima limitada

  • jitter (fluctuaciones) en los pulsos generados

  • añade carga a la CPU

2. Pruebas de latencia

LinuxCNC incluye varias pruebas de latencia. Todas producen información equivalente. Ejecutar estas pruebas ayudará a determinar si una computadora es adecuada para controlar una máquina CNC.

Nota
No ejecute LinuxCNC o StepConf mientras se ejecuta la prueba de latencia.

2.1. Prueba de latencia

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

Esto iniciará la prueba de latencia con un período base de hilo de 25 µs y un período servo-hilo de 1 ms. Los tiempos de período pueden ser especificados en la línea de comandos:

latency-test 50000 1000000

Esto iniciará la prueba de latency con un período base de hilo de 50 µs y un período de servo-hilo de 1 ms.

Para opciones disponibles, ingresar en la línea de comandos:

latency-test -h

Después de iniciar la prueba de latencia deberías ver algo como esto:

Prueba de latencia HAL
Figura 1. Prueba de latencia HAL

Mientras se ejecuta la prueba, debes abusar de la computadora. Mueve las ventanas alrededor de la pantalla. Navega por la web. Copia algunos archivos grandes en el disco. Pon música. Ejecuta un programa OpenGL como glxgears. La idea es poner la PC en aprietos mientras la prueba de latencia comprueba cuáles son los peores números.

Los números importantes son los de la columna max jitter (máxima fluctuación). En el ejemplo anterior, son 6693 nanosegundos (ns), o 6.693 microsegundos (µs). Anota este número e ingrésalo en StepConf cuando se solicite.

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.

Nota
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.

Para obtener más información sobre la afinación de pasos, consulta el capítulo Afinación de motores a pasos.

Sugerencia
Hay herramientas adicionales disponibles desde la línea de comandos para examinar la latencia cuando LinuxCNC no está corriendo.

2.2. Gráfica de latencia

latency-plot crea una gráfica de barras registrando los hilos base y servo. Puede ser útil para ver picos de latencia cuando se inician o se usan otras aplicaciones. Uso:

latency-plot --help

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

Options:
      --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)
Ventana de latency-plot
Figura 2. Ventana de latency-plot

2.3. Histograma de latencia

latency-histogram muestra un histograma de latencia (jitter) para hilos base y servo.

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

Options:
  --base      ns   (base  thread interval in nanoseconds, default:   25000, min:  5000)
  --servo     ns   (servo thread interval in nanoseconds, default: 1000000, min: 25000)
  --bbinsize  ns   (base  bin size in nanoseconds, default: 100
  --sbinsize  ns   (servo bin size in nanoseconds, default: 100
  --bbins     n    (base  bins, default: 200
  --sbins     n    (servo bins, default: 200
  --logscale  0|1  (y axis log scale, default: 1)
  --text      note (additional note, default: "" )
  --show           (show count of undisplayed bins)
  --nobase         (servo thread only)
  --verbose        (progress and debug)
  --nox            (no gui, display elapsed,min,max,sdev for each thread)
Nota
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.
Ventana de latency-histogram
Figura 3. Ventana de latency-histogram

3. Ajuste de latencia

LinuxCNC puede correr en muchas plataformas de hardware distintas y con diferentes kernels de tiempo real, y todas ellas se pueden beneficiar del ajuste de latencia óptima.

El primer objetivo es ajustar el sistema para que LinuxCNC reserve un CPU para uso exclusivo de las tareas en tiempo real de LinuxCNC, para que otras tareas (tanto programas de usuario como hilos del kernel) no interfieran con los accesos al CPU de LinuxCNC.

Cuando se cree que opciones específicas de ajuste son universalmente de ayuda, LinuxCNC realiza automáticamente este ajuste en el arranque, pero muchas opciones de ajuste son específicas de la máquina y no pueden realizarse automáticamente. La persona que instale LinuxCNC necesita determinar experimentalmente el ajuste óptimo para su sistema.

3.1. Ajustar el BIOS para latencia

Los BIOSes de PCs varían salvajemente en su comportamiento de latencia.

Ajustar el BIOS es tedioso porque tienes que reiniciar la computadora, hacer un pequeño ajuste en el BIOS, arrancar Linux, y ejecutar la prueba de latencia (potencialmente por mucho tiempo) para ver qué efecto tuvo tu cambio en el BIOS. Luego repetir para todas las otras configuraciones de BIOS que quieras intentar.

Ya que los BIOSes son todos diferentes y no estándar, no es práctico proporcionar una guía detallada de ajuste de BIOS. En general, algunas cosas a intentar ajustar en el BIOS son:

  • Deshabilitar ACPI, APM y cualquier otra prestación de ahorro de energía. Esto incluye cualquier cosa relacionada con ahorro de energía, suspensión, estados de reposo de la CPU, escalamiento de frecuencia de la CPU, etc.

  • Deshabilitar modo "turbo" de la CPU.

  • Deshabilitar hyper-threading de la CPU.

  • Deshabilitar (o de otro modo, controlar) Interrupción de Gerencia de Sistema (SMI).

  • Deshabilitar cualquier hardware que no pretendas usar.

3.2. Ajustar Preempt-RT para latencia

El kernel Preempt-RT puede beneficiarse del ajuste con tal de proporcionar la mejor latencia para LinuxCNC. Se puede realizar el ajuste por medio de la línea de comandos de kernel, sysctl, y por medio de archivos en /proc y /sys.

Algunos parámetros de ajuste a considerar:

Línea de comando de kernel

Detalles aquí: https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt

  • isolcpus: Previene que la mayoría de procesos que no son de LinuxCNC usen esas CPUs, dejando más tiempo de CPU disponible para LinuxCNC.

  • irqaffinity: Selecciona cuáles CPUs sirven interrupciones, para que los CPUs reservados para tiempo real de LinuxCNC no tengan que realizar esta tarea.

  • rcu_nocbs: Previene que las retrollamadas RCU se ejecuten en estas CPUs.

  • rcu_nocb_poll: Encuesta retrollamadas de RCU en lugar de usar dormir/despertar.

  • nohz_full: Desabilita el tictac del reloj en estas CPUs.

Sysctl

Detalles aquí: https://www.kernel.org/doc/html/latest/scheduler/sched-rt-group.html

  • sysctl.kernel.sched_rt_runtime_us: Establece a -1 para eliminar el límite de cuánto tiempo pueden usar las tareas en tiempo real.