Skip to main content

我的 IEC 应用程序的内存消耗正在增加。

准备工作:

你需要一个运行时系统,其中 CmpMemGC 组件已启用并处于活动状态。您可以在运行时日志中检查此组件是否已加载。

故障排除

如果您在 IEC 应用程序运行一段时间后发现奇怪的影响(例如许可证状态丢失或无法分配新内存),则这可能是内存泄漏造成的。

你应该调查这些影响并找到问题的根源。

CODESYS 存储设备追踪

此功能在运行时系统版本 SP19(SL 版本 4.9.0.0)及更高版本中可用。它可以很容易地使用:

  1. 在运行时环境中启用该设置。

    1. 通过以下方式停止运行时间 Deploy Tool

    2. 通过以下方式连接到目标系统 putty 或者其他 SSH 客户端。

    3. 使用文本编辑器(例如 nano)打开运行时环境的配置文件:

      sudo nano /etc/codesyscontrol/CODESYSControl.cfg
    4. CmpMemGC 部分,添加条目 EnableMemTrace=1

      [CmpMemGC]
      EnableMemTrace=1
    5. 保存并关闭该文件。

    6. 通过以下方式重新启动运行时 Deploy Tool

  2. 将设备跟踪添加到您的 CODESYS 项目(出现此问题的地方)。

    1. 在设备树中,右键单击该设备。

    2. 点击 添加对象设备跟踪

      这个 设备跟踪 对象插入控制器下方。

      这个 设备跟踪 显示选项卡。

    3. 点击 追踪上传追踪 命令。

      这个 设备 “codesys_control_for_Linux_SL” 的在线跟踪 对话框打开。

    4. 如果你找不到 memgcTrace 输入,则步骤 1 中的设置未正确设置。如果您的控制器不支持该机制,则使用以下两个选项之一进行诊断。

      _rtsl_img_iec_memory.png
    5. 选择 memgcTrace 输入并单击 上传并关闭对话框

      内存跟踪 (MemGCTrace) 已添加到 DeviceTrace

    有关更多信息,请参阅: 命令:上传跟踪

CODESYS 图书馆:SysMem

您还可以通过编程方式访问内部信息。您可以通过 IEC 库函数访问所有分配的 RAM /堆内存的当前概览

SysMem.SysMemGetCurrentHeapSize()

该值可用于观察当前的堆大小。您可以查看此值或将其写入跟踪。

这可以帮助您确定分配的内存的增加是否是基于时间的 IEC 应用程序中的某些其他事件。

Linux 命令行

如果您有权访问 Linux 控制台(例如,通过 SSH 客户端),则还可以检查内存行为。

有多种工具和命令可以实现此目的:

htop/top

这些是用于分析 Linux 系统上的进程(和线程)的图形工具。

几乎所有 Linux 发行版都提供这些工具,因此您可以通过以下方式轻松安装它们 apt 或者 dnf 或者发行版的包管理。

htop 
# or 
top

这两个工具都可用于在树视图中查看线程并分析 CODESYS 运行时进程及其线程。每个 IEC 任务都是 pthread 在运行时进程中。

在 htop 工具中,您可以通过以下方式自定义视图 F2 (设置菜单):我们建议您启用 Tree viewShow custom thread names 选项。

在上方区域,您可以使用组合键启用树视图 移动 + V 因此可以查看每个线程的 CPU 使用率/内存使用情况。这可以帮助您确定分配的内存的增加是否与 IEC 应用程序中的某些其他事件有关,或者您是否存在内存泄漏