1. Что такое задержка (latency)?

Задержка — это время, которое требуется ПК, чтобы остановить то, что он делает, и ответить на внешний запрос, например, запустить один из периодических потоков реального времени LinuxCNC. Чем меньше задержка, тем быстрее вы можете запустить потоки реального времени, и тем более плавным будет движение (и потенциально более быстрым в случае программного шагового перемещения).

Задержка гораздо важнее скорости ЦП. Скромный Pentium II, который реагирует на прерывания в течение 10 микросекунд каждый раз, может дать лучшие результаты, чем новейший и самый быстрый монстр P4 Hyperthreading.

Процессор — не единственный фактор, определяющий задержку. Материнские платы, видеокарты, порты USB и ряд других вещей могут повлиять на задержку. Лучший способ узнать, с чем вы имеете дело, — запустить тест на задержку.

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:

  • ограниченная максимальная скорость шага

  • джиттер в генерируемых импульсах

  • нагружает процессор

2. Тесты задержки

LinuxCNC включает несколько тестов на задержку. Все они выдают эквивалентную информацию. Запуск этих тестов поможет определить, подходит ли компьютер для управления станком с ЧПУ.

Note
Не запускайте LinuxCNC или StepConf во время выполнения теста задержки.

2.1. Latency 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

Это запустит тест задержки с периодом базового потока 25мкс и периодом сервопотока 1мс. Длительность периода можно указать в командной строке:

latency-test 50000 1000000

Это запустит тест задержки с периодом базового потока 50мкс и периодом сервопотока 1мс.

Для получения доступных параметров введите в командной строке:

latency-test -h

После запуска теста задержки вы должны увидеть что-то вроде этого:

Тест задержки HAL
Figure 1. Тест задержки HAL

Во время выполнения теста вам следует издеваться над компьютером. Перемещать окна по экрану. Полазить по веб-страницам. Скопировать несколько больших файлов на диск. Воспроизвести музыку. Запустить программу OpenGL, например glxgears. Идея состоит в том, чтобы подвергнуть ПК испытаниям, пока тест на задержку проверяет, каковы наихудшие показатели.

Важным числом для программного степпинга является максимальный джиттер базового потока. В приведенном выше примере это 6693 наносекунды (нс) или 6,693 микросекунды (мкс). Запишите это число и введите его в StepConf, когда оно будет запрошено.

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.

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

Для получения дополнительной информации о настройке шагового двигателя см. главу Stepper Tuning.

Tip
Доступны дополнительные инструменты командной строки для проверки задержки, когда LinuxCNC не запущен.

2.2. График задержки

latency-plot создает ленточную диаграмму для базового и сервопотока. Может быть полезно увидеть пики задержки при запуске или использовании других приложений. Использование:

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)
latency-plot Window
Figure 2. latency-plot Window

2.3. Гистограмма задержки

Гистограмма задержки приложения отображает гистограмму задержки (jitter) для базового и сервопотока.

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)
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 the +/- bin range are reported with special end bars. Use --show to show count for the off-chart [pos|neg] bin.
Окно latency-histogram
Figure 3. Окно latency-histogram

3. Настройка задержки

LinuxCNC может работать на многих различных аппаратных платформах и с различными ядрами реального времени, и все они могут выиграть от настройки на оптимальную задержку.

Основной целью настройки системы для LinuxCNC является резервирование ЦП для исключительного использования задач реального времени LinuxCNC, чтобы другие задачи (как пользовательские программы, так и потоки ядра) не мешали доступу LinuxCNC к этому ЦП.

Когда определенные параметры настройки считаются универсально полезными, LinuxCNC выполняет эту настройку автоматически при запуске, но многие параметры настройки зависят от станка и не могут быть выполнены автоматически. Человеку, устанавливающему LinuxCNC, необходимо экспериментально определить оптимальную настройку для своей системы.

3.1. Настройка BIOS на задержку

BIOS ПК существенно различаются по своим показателям задержки.

Настройка BIOS утомительна, поскольку вам нужно перезагрузить компьютер, сделать одну небольшую настройку в BIOS, загрузить Linux и запустить тест задержки (потенциально в течение длительного времени), чтобы увидеть, как повлияло изменение BIOS. Затем повторите для всех остальных настроек BIOS, которые вы хотите попробовать.

Поскольку все BIOS разные и нестандартные, предоставление подробного руководства по настройке BIOS нецелесообразно. В общем, вот некоторые вещи, которые можно попробовать настроить в BIOS:

  • Отключите ACPI, APM и любые другие функции энергосбережения. Сюда входит все, что связано с энергосбережением, приостановкой, состояниями сна ЦП, масштабированием частоты ЦП и т. д.

  • Отключить режим "турбо" процессора.

  • Отключить гиперпоточность ЦП.

  • Отключить (или иным образом контролировать) прерывание управления системой (SMI).

  • Отключите все оборудование, которое вы не собираетесь использовать.

3.2. Настройка Preempt-RT для задержки

Ядро Preempt-RT может выиграть от настройки, чтобы обеспечить наилучшую задержку для LinuxCNC. Настройка может быть выполнена через командную строку ядра, sysctl и через файлы в /proc и /sys.

Некоторые параметры настройки, на которые следует обратить внимание:

Командная строка ядра

Подробности здесь: https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt

  • isolcpus: запрещает большинству процессов, не относящихся к LinuxCNC, использовать эти процессоры, оставляя больше процессорного времени доступным для LinuxCNC.

  • irqaffinity: Выберите, какие ЦП обслуживают прерывания, чтобы ЦП, зарезервированные для LinuxCNC realtime, не приходилось выполнять эту задачу.

  • rcu_nocbs: запретить запуск обратных вызовов RCU на этих процессорах.

  • rcu_nocb_poll: Опрос обратных вызовов RCU вместо использования режима сна/пробуждения.

  • nohz_full: Отключить тактовую частоту на этих процессорах.

Sysctl

Подробности здесь: https://www.kernel.org/doc/html/latest/scheduler/sched-rt-group.html

  • sysctl.kernel.sched_rt_runtime_us: установите значение -1, чтобы снять ограничение на время, которое могут использовать задачи реального времени.