【NodeRed】MCProtocol 组件的MaxListenersExceededWarning 告警
- 问题
- 解析
- 解决方案
问题
在NodeRed 中采用MCProtocol ,以MC协议进行PLC的信息读写,但在同一个NodeRed 端口下,多窗口设置多个MCProtocol 系列组件,会进行告警:
(node:30132) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [MCProtocol]. Use emitter.setMaxListeners() to increase limit
(Usenode --trace-warnings ...
to show where the warning was created)
刚开始告警时,由于不影响使用就没有管。但是运行较长时间后,出现了信息读写出错的问题,重新启动后又恢复正常。针对这个情况,对告警进行解决。
解析
首先,对告警进行翻译,大致意思就是MC事件监听器使用超了,那问题就定位到了MC模块。然后,运行node --trace-warnings red2.js
进行调试,查找报错位置:
(node:32480) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [MCProtocol]. Use emitter.setMaxListeners() to increase limit
at _addListener (node:events:592:17)
at MCProtocol.addListener (node:events:610:10)
at Object.on (C:\Users\11003189.node-red\node_modules\node-red-contrib-mcprotocol\connection_pool.js:88:17)
at new mcRead (C:\Users\11003189.node-red\node_modules\node-red-contrib-mcprotocol\nodes\read.js:60:23)
at Object.createNode (C:\Users\11003189\AppData\Roaming\npm\node_modules\node-red\node_modules@node-red\runtime\lib\flows\util.js:182:27)
at Flow.start (C:\Users\11003189\AppData\Roaming\npm\node_modules\node-red\node_modules@node-red\runtime\lib\flows\Flow.js:261:54)
at Object.start [as startFlows] (C:\Users\11003189\AppData\Roaming\npm\node_modules\node-red\node_modules@node-red\runtime\lib\flows\index.js:403:17)
里面connection_pool.js:88:17
中88是行数,17是该行列数。
问题出在_addListener
,直接查Listener
找监听器数量设置,定位到了文件mcprotocol.js
文件。整个文件看下来发现没有设置,用的默认参数。看了网上一些资料,一般监听器数量默认是10个。虽然nodeRed开了多窗口,但是NodeJS是单线程的,所以使用数量肯定是超了的,这边有个点很奇怪,它日志输出有11个错误,但是实际MC组件超了11个,很奇怪这个数量是怎么确定的,难道是MC的默认监听数量?
解决方案
在C:\Users\11003189\.node-red\node_modules\node-red-contrib-mcprotocol\mcprotocol
中增加监听器数量设置,EventEmitter.defaultMaxListeners = 0;
设置为0表示不进行数量限制。
在变更后,重新启动文件,MaxListenersExceededWarning 告警就没有了。