优化 Node-RED OPC UA 性能:批量订阅与资源消耗减少技巧

devtools/2025/2/20 16:55:54/

opcua__0">言简意赅的讲解Node-RED 中 node-red-contrib-opcua 节点的性能问题

之前给大家讲解了Node-Red如何使用,但在使用OPC UA时候遇到了瓶颈。OPC UA(开放平台通信统一架构)作为一种工业协议被广泛应用于设备数据采集与监控。Node-RED,作为一个强大的流程自动化工具,提供了 node-red-contrib-opcua 节点来支持 OPC UA 客户端的功能,使得开发者能够通过可视化的方式集成 OPC UA 数据。

然而,在一些应用场景中,使用 OPC UA 节点时可能会遇到性能瓶颈,尤其是在多个 OPC UA 变量订阅的情况下。本文将探讨如何优化 node-red-contrib-opcua 节点的性能,尤其是如何避免因创建过多的订阅而引起的 CPU 资源消耗问题。
<a class=node-red-contrib-opcua 看板" />

问题 1:错误的使用方式导致过多的 Topic 创建

在 Node-RED 中,有些开发者可能会以如下方式使用 OPC UA 客户端节点:

javascript">let payloadArray = [{ "topic": "ns=2;i=1331" },{ "topic": "ns=2;i=1332" }
];for (let t in payloadArray) {msg.topic = payloadArray[t].topic;node.send(msg);
}

<a class=node-red-contrib-opcua性能分析" />

问题分析:

这种方式通过 node.send(msg) 不断地发送带有不同 topic 的消息,可能导致以下几个问题:

  • 过度创建订阅:每次发送消息时,都会为 topic 创建新的订阅,这可能会导致在较大的应用场景下,生成大量的订阅,并且每个订阅都需要维护一定的资源和周期性轮询,最终导致服务器或 OPC UA 客户端性能的下降。
  • 高 CPU 消耗:由于每个 OPC UA 节点(topic)都会创建单独的订阅,这可能导致在大量订阅的情况下,系统的 CPU 使用率迅速攀升,造成不必要的性能消耗。

问题 2:官方文档中的配置方式

根据官方文档,node-red-contrib-opcua 节点提供了丰富的配置选项来设置订阅的间隔、队列大小、死区(Deadband)等参数。这些配置选项允许开发者根据具体需求对 OPC UA 订阅的行为进行调整,例如:

属性功能/值备注
payload设置订阅或监视项的间隔
interval订阅间隔
queueSize订阅队列大小
deadbandType“a”(绝对值)或 “p”(百分比)设置监视器的死区类型
topicNodeId 和数据类型,格式为 ns=3;s=Counter;datatype=Int32
actionsubscribe、unsubscribe、deletesubscription、browse、info等设置操作类型
readmultiple读取多个变量的节点Id及数据类型
writemultiple写入多个变量的节点Id、数据类型和值

在文档中,readmultiplewritemultiple 操作提供了批量读取和批量写入的功能,这样可以减少因单个节点订阅或读取/写入操作引发的性能问题。

然而,实际应用中,开发者可能没有充分利用这些高级功能,导致了不必要的资源消耗。

问题 3:优化的解决方案

通过批量订阅减少资源消耗

在实际的性能测试中,采用以下优化方式能够显著提高系统的性能,特别是在大量 OPC UA 变量订阅时:

javascript">msg.topic = "multiple";
msg.payload = [];
msg.payload.push({ nodeId: "ns=2;i=981;s=Double" });
msg.payload.push({ nodeId: "ns=2;i=982;s=Double" });
return msg;

<a class=node-red-contrib-opcua性能监控" />

通过一次性将多个 nodeId 打包到 msg.payload 中,并发送给 OPC UA 节点,我们可以有效地减少创建多次订阅的开销。这样做的好处包括:

  • 减少订阅数量:通过批量订阅,减少了每个节点的独立订阅请求,避免了创建过多的订阅项,降低了系统的负担。
  • 提高性能:批量处理可以有效减少 OPC UA 客户端的连接与通信负担,从而显著降低 CPU 使用率。

性能测试结果

在一个典型的测试场景下,我们对比了两种方式在 1000 个 OPC UA 节点同时订阅的情况下的性能表现:

  1. 方法一(错误的方式):每个节点单独发送一个消息进行订阅。结果显示,CPU 使用率接近 100%。
  2. 方法二(优化的方式):将多个节点合并在一个消息中进行批量订阅。结果显示,CPU 使用率降低到仅 10%。

从图中可以清晰地看到,方法二的优化方式在处理大量订阅时能够显著降低系统的负载,节省大量计算资源。

注意 我把我的测试用例贴给大家,仅供参考。

进一步优化的思路

1. 使用死区值(Deadband)来减少频繁的数据更新

OPC UA 支持使用死区值(Deadband)来控制数据更新的频率。当变量值变化不超过设定的死区值时,不再触发新的数据更新,这有助于降低 OPC UA 服务器和客户端的通信负担,进一步优化性能。

2. 调整订阅间隔和队列大小

通过设置合适的订阅间隔(interval)和队列大小(queueSize),可以更灵活地控制数据的采集频率和队列的处理方式。合理的配置可以在保证数据实时性的前提下,避免过多的轮询和不必要的资源消耗。

3. 避免重复订阅

在一些场景下,多个节点可能订阅了相同的 topic 或相同的节点ID。为了避免不必要的重复订阅,开发者可以在订阅前检查是否已有相同的订阅,以此来减少资源的浪费。

4. 使用异步处理

Node-RED 提供了异步处理的机制,通过 asyncawait 语法,开发者可以在处理 OPC UA 订阅时避免阻塞主线程,提升系统的响应能力和并发处理能力。

结论

在使用 node-red-contrib-opcua 节点时,避免通过逐一订阅大量 topic 的方式来降低性能问题。采用批量订阅、合理配置订阅间隔、使用死区值以及优化订阅策略,能够有效提升系统性能并降低 CPU 消耗。通过这些优化措施,开发者可以在工业自动化和物联网项目中实现更高效的数据采集与处理。

在未来的应用中,我们可以继续探索更灵活的配置选项和最佳实践,以应对更复杂的工业场景。


通过上述内容,你就已经基本理解了这个方法,基础用法我也都有展示。如果你能融会贯通,我相信你会很强

Best
Wenhao (楠博万)


http://www.ppmy.cn/devtools/147419.html

相关文章

[Linux] 服务器CPU信息

&#xff08;1&#xff09;查看CPU信息&#xff08;型号&#xff09; cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c输出&#xff1a;可以看到有128个虚拟CPU核心&#xff0c;型号是后面一串 128 Intel(R) Xeon(R) Platinum 8336C CPU 2.30GHz&#xff08;2&…

Ardunio BLE keyboard 库的使用

为了开发一个 ardunio 的蓝牙选歌器&#xff0c;网络上普遍推荐使用&#xff1a; https://github.com/T-vK/ESP32-BLE-Keyboard 结果搞了好几天&#xff0c;就是不行。最后发现&#xff0c;下面两点非常重要&#xff1a; 使用 NimBle-ardunio 库这个库目前是2.1.2 &#xff…

matlab 设计滤波器

滤波器可视化工具 fvtool 与 filterAnalyzer 设计滤波器&#xff1a; matlab 菜单栏 APP - 滤波器设计

5G终端串口AT命令 FM650 常用命令

5G终端串口AT命令 FM650 常用命令 5G终端串口AT命令 FM650 常用命令 #状态查询 MODULE_PORT/dev/ttyUSB0echo -e "ATE0\r\n" > $MODULE_PORT echo -e "ATGTUSBMODE?\r\n" > $MODULE_PORT echo -e "ATGTRAT?" > $MODULE_PORT ec…

C++高级编程技巧:模板元编程与性能优化实践

C高级编程技巧&#xff1a;模板元编程与性能优化实践 在C编程的世界里&#xff0c;模板元编程&#xff08;Template Metaprogramming&#xff09;是一项强大的技术&#xff0c;它允许程序员在编译时而非运行时进行计算和类型操作。这项技术的核心在于C模板系统&#xff0c;它…

小米15震撼发布:手机吊起一人一椅,创新极限测试

作者&#xff1a;扣子AI 01 一、手机行业背景与竞争态势 手机行业如今已迈入“夕阳产业”的阶段&#xff0c;然而在这看似黯淡的局面中&#xff0c;小米和华为却异军突起&#xff0c;成为了这个时代的顶流。 2024 年 11 月中旬&#xff0c;万众期待的华为 Mate70 即将亮相&…

Vue.js组件开发-如何处理刷新Token失败的情况

在Vue.js组件开发中&#xff0c;处理刷新Token失败的情况需要综合考虑用户体验、安全性和应用逻辑。 处理方法 1. 拦截器中处理刷新Token逻辑 在Axios拦截器中&#xff0c;可以添加处理刷新Token的逻辑。当检测到Token过期或无效时&#xff0c;尝试使用刷新Token来获取新的访…

Learning Multi-Scale Photo Exposure Correction

Abstract 用错误的曝光捕捉照片仍然是相机成像的主要错误来源。曝光问题可分为以下两类:(i)曝光过度&#xff0c;即相机曝光时间过长&#xff0c;导致图像区域明亮和褪色;(ii)曝光不足&#xff0c;即曝光时间过短&#xff0c;导致图像区域变暗。曝光不足和曝光过度都会大大降低…