Skip to main content

性能优化

在此页面上,我们将向您展示如何设置您的设备, CODESYS Virtual Control SL和您的应用程序,以便您实现最佳性能。

我们为您提供可用于检查和评估系统当前状态的工具。

我们建议执行以下程序。按指定的顺序完成这些步骤。如果当前步骤没有达到所需的优化程度,那么继续下一步是没有意义的。

  1. 检查硬件

  2. 设置 Linux

  3. 配置 CODESYS 运行时系统

  4. 配置 IEC 应用程序

重要

每个步骤之后,检查最后的更改是否不会对之前步骤的优化产生负面影响。

在正常负载下达到所需的性能后,您可以选择在高负载下执行测试 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 运行时系统

  • 创建一个测试应用程序,大致描述您想要优化系统的应用程序(根据所需的资源、所需的性能和项目规模)。

  • 您可以迭代地执行此操作:首先创建一个非常粗略的近似值,然后对其进行扩展以越来越接近实际应用程序。

测试

当应用程序运行时,检查任务配置。打开 任务配置 并选择 监视器 标签。

_rtsl_img_performance_oprimization_cds.png
  • 分钟。抖动 (μ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

  • 确定任务的正确优先级。重要的任务应该有更高的优先级。

    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。使用上述优先级(高负载)可能会导致系统功能(网络/存储)无法按预期运行



  • 您可以在相应的任务配置中配置任务的优先级。

    _rtsl_img_performance_iec.PNG

如果在执行此处提到的所有步骤后仍未达到所需的性能,那么您可以查看以下部分:

现场总线特定信息

测试

  • 检查 Send Time / Recv Time EtherCAT 状态页面上的值。

    • 配备 Intel Core i7 处理器和良好适配器的 x64 CPU 的时间应该少于 10μs。

    • 具有集成芯片的 ARM 处理器将具有约 50μs 或更长的时间。

    _rtsl_img_performance_ecat.png
  • 检查 Send Time / Recv Time PROFINET 状态页上的值。

    • 配备 Intel Core i7 处理器和良好适配器的 x64 CPU 的时间应该少于 10μs。

    • 具有集成芯片的 ARM 处理器将具有约 50μs 或更长的时间。

    _rtsl_img_performance_pn.png

优化选项

  • 要对优先级和所需的 IRQ 进行排序,您可以使用 PLC shell 命令 irq-listirq-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