我的 IEC 应用程序的内存消耗正在增加。
准备工作:
你需要一个运行时系统,其中 CmpMemGC
组件已启用并处于活动状态。您可以在运行时日志中检查此组件是否已加载。
故障排除
如果您在 IEC 应用程序运行一段时间后发现奇怪的影响(例如许可证状态丢失或无法分配新内存),则这可能是内存泄漏造成的。
你应该调查这些影响并找到问题的根源。
CODESYS 存储设备追踪
此功能在运行时系统版本 SP19(SL 版本 4.9.0.0)及更高版本中可用。它可以很容易地使用:
在运行时环境中启用该设置。
通过以下方式停止运行时间 Deploy Tool。
通过以下方式连接到目标系统
putty
或者其他 SSH 客户端。使用文本编辑器(例如 nano)打开运行时环境的配置文件:
sudo nano /etc/codesyscontrol/CODESYSControl.cfg
在
CmpMemGC
部分,添加条目EnableMemTrace=1
。[CmpMemGC] EnableMemTrace=1
保存并关闭该文件。
通过以下方式重新启动运行时 Deploy Tool。
将设备跟踪添加到您的 CODESYS 项目(出现此问题的地方)。
在设备树中,右键单击该设备。
点击 添加对象 → 设备跟踪。
这个 设备跟踪 对象插入控制器下方。
这个 设备跟踪 显示选项卡。
点击 追踪 → 上传追踪 命令。
这个 设备 “codesys_control_for_Linux_SL” 的在线跟踪 对话框打开。
如果你找不到 memgcTrace 输入,则步骤 1 中的设置未正确设置。如果您的控制器不支持该机制,则使用以下两个选项之一进行诊断。
选择 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 view
和 Show custom thread names
选项。
在上方区域,您可以使用组合键启用树视图 移动 + V 因此可以查看每个线程的 CPU 使用率/内存使用情况。这可以帮助您确定分配的内存的增加是否与 IEC 应用程序中的某些其他事件有关,或者您是否存在内存泄漏