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 资源消耗问题。
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);
}
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”(百分比) | 设置监视器的死区类型 |
topic | NodeId 和数据类型,格式为 ns=3;s=Counter;datatype=Int32 | |
action | subscribe、unsubscribe、deletesubscription、browse、info等 | 设置操作类型 |
readmultiple | 读取多个变量的节点Id及数据类型 | |
writemultiple | 写入多个变量的节点Id、数据类型和值 |
在文档中,readmultiple
和 writemultiple
操作提供了批量读取和批量写入的功能,这样可以减少因单个节点订阅或读取/写入操作引发的性能问题。
然而,实际应用中,开发者可能没有充分利用这些高级功能,导致了不必要的资源消耗。
问题 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;
node-red-contrib-opcua性能监控" />
通过一次性将多个 nodeId
打包到 msg.payload
中,并发送给 OPC UA 节点,我们可以有效地减少创建多次订阅的开销。这样做的好处包括:
- 减少订阅数量:通过批量订阅,减少了每个节点的独立订阅请求,避免了创建过多的订阅项,降低了系统的负担。
- 提高性能:批量处理可以有效减少 OPC UA 客户端的连接与通信负担,从而显著降低 CPU 使用率。
性能测试结果
在一个典型的测试场景下,我们对比了两种方式在 1000 个 OPC UA 节点同时订阅的情况下的性能表现:
- 方法一(错误的方式):每个节点单独发送一个消息进行订阅。结果显示,CPU 使用率接近 100%。
- 方法二(优化的方式):将多个节点合并在一个消息中进行批量订阅。结果显示,CPU 使用率降低到仅 10%。
从图中可以清晰地看到,方法二的优化方式在处理大量订阅时能够显著降低系统的负载,节省大量计算资源。
注意
我把我的测试用例贴给大家,仅供参考。
进一步优化的思路
1. 使用死区值(Deadband)来减少频繁的数据更新
OPC UA 支持使用死区值(Deadband)来控制数据更新的频率。当变量值变化不超过设定的死区值时,不再触发新的数据更新,这有助于降低 OPC UA 服务器和客户端的通信负担,进一步优化性能。
2. 调整订阅间隔和队列大小
通过设置合适的订阅间隔(interval
)和队列大小(queueSize
),可以更灵活地控制数据的采集频率和队列的处理方式。合理的配置可以在保证数据实时性的前提下,避免过多的轮询和不必要的资源消耗。
3. 避免重复订阅
在一些场景下,多个节点可能订阅了相同的 topic
或相同的节点ID。为了避免不必要的重复订阅,开发者可以在订阅前检查是否已有相同的订阅,以此来减少资源的浪费。
4. 使用异步处理
Node-RED 提供了异步处理的机制,通过 async
和 await
语法,开发者可以在处理 OPC UA 订阅时避免阻塞主线程,提升系统的响应能力和并发处理能力。
结论
在使用 node-red-contrib-opcua
节点时,避免通过逐一订阅大量 topic
的方式来降低性能问题。采用批量订阅、合理配置订阅间隔、使用死区值以及优化订阅策略,能够有效提升系统性能并降低 CPU 消耗。通过这些优化措施,开发者可以在工业自动化和物联网项目中实现更高效的数据采集与处理。
在未来的应用中,我们可以继续探索更灵活的配置选项和最佳实践,以应对更复杂的工业场景。
通过上述内容,你就已经基本理解了这个方法,基础用法我也都有展示。如果你能融会贯通,我相信你会很强
Best
Wenhao (楠博万)