1. Что такое задержка (latency)?
Задержка — это время, которое требуется ПК, чтобы остановить то, что он делает, и ответить на внешний запрос, например, запустить один из периодических потоков реального времени LinuxCNC. Чем меньше задержка, тем быстрее вы можете запустить потоки реального времени, и тем более плавным будет движение (и потенциально более быстрым в случае программного шагового перемещения).
Задержка гораздо важнее скорости ЦП. Скромный Pentium II, который реагирует на прерывания в течение 10 микросекунд каждый раз, может дать лучшие результаты, чем новейший и самый быстрый монстр P4 Hyperthreading.
Процессор — не единственный фактор, определяющий задержку. Материнские платы, видеокарты, порты USB и ряд других вещей могут повлиять на задержку. Лучший способ узнать, с чем вы имеете дело, — запустить тест на задержку.
Генерация шаговых импульсов в программном обеспечении имеет одно очень большое преимущество - это бесплатно. Почти каждый ПК имеет параллельный порт, который способен выводить шаговые импульсы, генерируемые программным обеспечением. Однако программные шаговые импульсы также имеют некоторые недостатки:
-
ограниченная максимальная скорость шага
-
джиттер в генерируемых импульсах
-
нагружает процессор
2. Latency Tests
LinuxCNC включает несколько тестов на задержку. Все они выдают эквивалентную информацию. Запуск этих тестов поможет определить, подходит ли компьютер для управления станком с ЧПУ.
Note
|
Не запускайте LinuxCNC или StepConf во время выполнения теста задержки. |
2.1. Latency Test
Чтобы запустить тест, откройте окно терминала (в Ubuntu — Applications → Accessories → Terminal) и выполните следующую команду:
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.
Для получения доступных параметров введите в командной строке:
latency-test -h
После запуска теста задержки вы должны увидеть что-то вроде этого:
Во время выполнения теста вам следует издеваться над компьютером. Перемещать окна по экрану. Полазить по веб-страницам. Скопировать несколько больших файлов на диск. Воспроизвести музыку. Запустить программу 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 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.
Note
|
Если вы получили высокие цифры, возможно, есть способы их улучшить. У другого ПК была очень плохая задержка (несколько миллисекунд) при использовании встроенного видео. Но видеокарта за 5 долларов решила проблему. LinuxCNC не требует новейшего оборудования. |
Для получения дополнительной информации о настройке шагового двигателя см. главу 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)
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 of the +/- bin range are reported with special end bars. Use --show to show count for the off-chart [pos|neg] bin
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, чтобы снять ограничение на время, которое могут использовать задачи реального времени.
-