LinuxCNC Documentation
This page is 82% translated. Untranslated text is shown in English.

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

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

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

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

Генерация шаговых импульсов в программном обеспечении имеет одно очень большое преимущество - это бесплатно. Почти каждый ПК имеет параллельный порт, который способен выводить шаговые импульсы, генерируемые программным обеспечением.

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

2.4. Realtime status bar

The latency-test and latency-histogram windows show a status bar along the bottom with three fields. A field turns red when it indicates a condition that makes the measured latency unrepresentative of a properly configured realtime system.

В реальном времени

The realtime type that rtapi is running, as reported by realtime verify, for example Preempt RT, RTAI or Xenomai. It reads No realtime (red) when rtapi_app cannot obtain realtime scheduling, either because the running kernel is not a realtime kernel (see Kernel and Version requirements) or because rtapi_app lacks the required privileges on a run-in-place build (see Realtime, run sudo make setuid or sudo make setcap). In this state the figures reflect ordinary, non-realtime scheduling and will be far worse than a realtime kernel delivers. For testing only, realtime can be forced with the LINUXCNC_FORCE_REALTIME=1 environment variable.

CPU governor

The active CPU frequency governor. It is shown in red when it is not performance, because frequency scaling lets the CPU drop to a lower clock speed and adds latency spikes. See CPU frequency governor.

isolcpus

Whether any CPUs are isolated for the exclusive use of LinuxCNC (isolcpus=...) or not (no_isolcpus). Isolating a CPU keeps other tasks off it and improves latency; see Tuning Preempt-RT for latency.

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

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

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

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

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

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

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

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

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

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

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

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

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

3.2. CPU frequency governor

Frequency scaling lets the CPU lower its clock speed to save power, which adds latency while the CPU ramps back up to service a realtime thread. For the best latency, set the governor to performance on every CPU:

echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

This setting does not survive a reboot. To make it permanent, apply it at boot with a small systemd service, or with a CPU frequency management tool such as cpupower (Debian/Ubuntu package linux-cpupower) or tuned.

3.3. Настройка 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, чтобы снять ограничение на время, которое могут использовать задачи реального времени.