性能优化
在此页面上,我们将向您展示如何设置您的设备, CODESYS Virtual Control SL和您的应用程序,以便您实现最佳性能。
我们为您提供可用于检查和评估系统当前状态的工具。
我们建议执行以下程序。按指定的顺序完成这些步骤。如果当前步骤没有达到所需的优化程度,那么继续下一步是没有意义的。
重要
每个步骤之后,检查最后的更改是否不会对之前步骤的优化产生负面影响。
在正常负载下达到所需的性能后,您可以选择在高负载下执行测试 stress-ng
或者 iperf
。
检查硬件
不要对控制器的处理器核心使用共享缓存。
如果您的目标设备使用基于以太网的现场总线,请为其使用物理适配器。不要使用交换机架构。
设置 Linux
使用实时内核。
我们建议使用 RT 抢占内核(https://rt.wiki.kernel.org)适用于您的 Linux 系统。对于 Debian 和 Ubuntu 发行版,您会发现 RT 内核是一个软件包,您可以使用以下命令轻松安装它:
apt
命令。有关详细信息,请参阅您的发行版的手册。在 Debian 系统上
sudo apt-get install linux-image-rt-amd64
检查您正在使用哪个内核
uname -a
命令。例如。
避免在系统上使用窗口管理器、GUI/X 服务器或类似工具。
使用这些工具可能会影响系统的实时功能,从而导致 IEC 应用程序出现高抖动。
测试
使用“rt-tools”:
安装“rt-tools”:
sudo apt install rt-tests
开始“循环测试”:
sudo cyclictest -p 99 -t -m
这
man cyclictest
命令向您显示更多命令行选项,您可以使用它们更好地测量系统的更多或特定性能方面。
使用“循环测试”确定的值是否可以被视为“良好”取决于您的硬件。如果您使用的是功能非常强大的处理器(例如 Intel Core i7),那么您的最大值应该为低 1 位数字。如果您使用旧的 ARM 处理器,那么 100 可能是一个不错的结果。
优化选项
重要
更改每个设置或设置组合后,您应该运行 “cyclictest” 程序来验证更改的有效性。
这些设置不是永久性的,因此必须在系统启动或重新启动后重置。
禁用CPU节能模式。
禁用超线程。
您可以使用以下命令禁用超线程(示例):
echo off | sudo tee /sys/devices/system/cpu/smt/control
尽可能禁用 CPU 频率缩放和切换。
例如,将最小和最大 CPU 频率设置为相同(固定)值。
禁用 Linux 内核的实时限制机制,因为这可能会导致系统抖动。
有关更多信息,请参阅: Linux 基金会:日程安排 — RT 节流
您可以使用以下命令禁用实时限制(示例):
echo -1 > /proc/sys/kernel/sched_rt_runtime_us
检查并更改调度/缩放调节器。
检查使用的调度/缩放调节器:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
更改使用的调度/缩放调节器(如
root/admin
) 到Performance
:echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # set it for all available cores: echo "performance" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor echo "performance" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor echo "performance" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor
请注意,每次系统启动时都必须重置缩放调节器。您也可以通过内核配置来设置它。
这
intel_pstate
内核驱动程序会使正确的设置变得更加困难。因此,您应该使用cpufreq-info
命令来检查您的配置。您还可以使用诸如
cpu-freq-utils
。这可能会干扰 Intel pstate 驱动程序。这些驱动程序通常需要不同的方法来设置 CPU 频率。有关更多信息,请参阅: https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt
禁用
HyperV
在 BIOS 中(如果有)。
配置 CODESYS 运行时系统
创建一个测试应用程序,大致描述您想要优化系统的应用程序(根据所需的资源、所需的性能和项目规模)。
您可以迭代地执行此操作:首先创建一个非常粗略的近似值,然后对其进行扩展以越来越接近实际应用程序。
测试
当应用程序运行时,检查任务配置。打开 任务配置 并选择 监视器 标签。

分钟。抖动 (μs) / 最大抖动(微秒)
平均周期时间(微秒)/最大周期时间周期时间 (µs) 周期时间 (µs)
最大周期不应接近配置的周期时间。一旦系统遇到高负载,这就会导致问题。
始终保持周期时间尽可能短。
优化选项
重要
更改每个设置或设置组合后,应运行“循环测试”程序来验证更改的有效性。
将长时间运行的任务拆分为多个较小的任务。
运行时,最高优先级任务的最大循环时间不应达到配置的循环时间。如果无法避免这种情况,则应增加配置的周期时间以确保一致的执行时间。
启动现场总线系统(例如 EtherCAT 或 PROFINET)时,启动周期可能会导致 CPU 负载稍高。在这种情况下,在启动应用程序后不久监控 CPU 负载是有意义的。
以下选项无法更改 CODESYS Virtual Control SL,但需要在主机上配置:
设置值
DisableCpuDmaLatency
至 1:[SysCpuHandling] Linux.DisableCpuDmaLatency=1
请注意,这是运行时版本 4.11.0.0 的默认设置。
要检查您的运行时版本,请单击 附加功能 → 更新Linux → 系统 → 系统信息。
检查实时内核是否真正被使用。
从版本 4.11.0.0 开始,您可以使用 PLC shell 命令
rt-get kernelinfo
检查这个。如果您有旧版本,那么您可以直接在命令行上使用以下命令执行此操作
uname -a
。如果实时内核没有被使用,那么你需要从头开始。
配置 IEC 应用程序
本节涉及您的实际应用。
测试
您可以使用上一步中的测试 配置 CODESYS 运行时系统 测试您的 IEC 应用程序。
优化选项
重要
更改每个设置或设置组合后,应运行“循环测试”程序来验证更改的有效性。
您可以使用 多核 特色于 CODESYS。
确定任务的正确优先级。重要的任务应该有更高的优先级。
表 5. IEC任务优先级和Linux线程优先级的映射:IEC 任务优先级
Linux优先级
--
88(SCHED_FIFO)
--
57(SCHED_FIFO)
0(最高实时优先级)
56(SCHED_FIFO)
15(最低实时优先级)
41(SCHED_FIFO)
16(非实时优先)
0 (SCHED_OTHER)
31(非实时优先)
0 (SCHED_OTHER)
--
0 (SCHED_OTHER)
注意
传统的 Linux 系统上,大多数中断 (IRQ) 和内核工作程序的优先级为 Linux 50。使用上述优先级(高负载)可能会导致系统功能(网络/存储)无法按预期运行
您可以在相应的任务配置中配置任务的优先级。
如果在执行此处提到的所有步骤后仍未达到所需的性能,那么您可以查看以下部分:
现场总线特定信息
测试
检查
Send Time
/Recv Time
EtherCAT 状态页面上的值。配备 Intel Core i7 处理器和良好适配器的 x64 CPU 的时间应该少于 10μs。
具有集成芯片的 ARM 处理器将具有约 50μs 或更长的时间。
检查
Send Time
/Recv Time
PROFINET 状态页上的值。配备 Intel Core i7 处理器和良好适配器的 x64 CPU 的时间应该少于 10μs。
具有集成芯片的 ARM 处理器将具有约 50μs 或更长的时间。
优化选项
要对优先级和所需的 IRQ 进行排序,您可以使用 PLC shell 命令
irq-list
和irq-set-prio
。这些命令使用正常的 Linux 优先级,而不是 IEC 优先级。
这种优化在以下情况下是不可能的 CODESYS Virtual Control SL,而是在主机系统上。
为设备使用单独的网络适配器。
有关更多信息,请参阅:
[针对专家] – 其他工具和主题
本节中描述的工具和选项仅适用于高级用户,需要您自己研究,因为要采取的措施在很大程度上取决于相关系统。因此,我们无法为您提供任何具体的解决方案。
KernelShark / 内核跟踪
如果您发现性能问题的原因在于调度,则可以选择此程序。借助“内核跟踪”,您可以查看您的任务是否被另一个任务、另一个服务或中断中断。
trace-cmd record -p function
您可以使用 KernelShark 检查生成的
trace.dat
文件。
一般来说,调度问题可以分为两类:
取代/抢占
如果不需要中断或阻止执行的任务,则禁用它。
提高您的任务的优先级或降低其他任务的优先级。
切换到不同的 CPU 核心。
重要
使用上一章中描述的程序检查更改的有效性。
执行时间处理时间
参见下文:“内核函数跟踪”
内核函数跟踪
如果您确定代码执行时间太长,那么您可以使用此工具来查明问题。
如果执行时间太长的函数在您自己的代码中,那么您需要对其进行优化。
如果执行时间太长的函数在内核中,那么您可以尝试使用另一个内核函数来实现所需的功能。或者,您也可以将配置参数传递给内核驱动程序以减少执行时间。
如果这些选项都不能解决问题,那么您可能需要使用更强大的硬件。
查看以下几点并检查它们是否是实现性能目标的正确工具:
PREEMPT_FULL
独立CPU
rcu_nocbs
rcu_nocb_poll
无软锁定
中断平衡禁用
kernel.sched_rt_runtime_us