大量postMessages后,nodejs webworker-threads崩溃

时间:2019-04-29 00:15:12

标签: node.js web-worker

在向Webworker发送大量postMessage之后,我得到了异常中止和stacktrace,如下所示。 我将间隔时间从250ms减少到6ms,然后这个问题出现的时间更早了,大约是45分钟,而不是6-9小时。

代码很简单

mainapp.js

*(a + ((dia) * (n) + (dia))

myappwebworker.js

((dia) * (n) + (dia)

这是什么原因?我是否由于垃圾收集器没有时间运行或类似原因而耗尽堆内存?在任何情况下都可以采取什么措施来防止这种情况发生?

这是最初的问题,直到我根据发现进行更新

标题: nodejs webworker-threads调试,从哪里开始?

如果在运行Nodejs应用程序7-8小时后获得了此类堆栈跟踪信息,该如何开始对其进行调试以找到代码中的罪魁祸首?

const Worker = require('webworker-threads').Worker;
var myappwebworker = new Worker('./myappwebworker.js');
myappwebworker.addEventListener('message', function(e) {
  console.log(e)
});
setInterval(function() {  
  myappwebworker.postMessage('hello');
}, 250); // or 5 for abort in about 45min

这是一个类似的堆栈跟踪

self.addEventListener('message', function(e) {
  self.postMessage('You said: ' + e.data);
}, false);

每秒至少有4条消息发布到Webworker和代码

以这种方式设置网络工作者

node[3836]: ../src/node_platform.cc:414:std::shared_ptr<node::PerIsolatePlatformData> node::NodePlatform::ForIsolate(v8::Isolate*): Assertion `data' failed.
 1: 0x8dc510 node::Abort() [node]
 2: 0x8dc5e5  [node]
 3: 0x965687 node::NodePlatform::CallOnForegroundThread(v8::Isolate*, v8::Task*) [node]
 4: 0xeda2ab v8::internal::IncrementalMarking::Start(v8::internal::GarbageCollectionReason) [node]
 5: 0xed4b6c v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
 6: 0xed7371 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [node]
 7: 0xeac650  [node]
 8: 0xeac6e7 v8::internal::Factory::NewJSObject(v8::internal::Handle<v8::internal::JSFunction>, v8::internal::PretenureFlag) [node]
 9: 0xae84ae v8::Object::New(v8::Isolate*) [node]
10: 0x7ff7eb5f0913 BSONDeserializer::DeserializeDocumentInternal(bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
11: 0x7ff7eb5f0b97 BSONDeserializer::DeserializeDocument(bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
12: 0x7ff7eb5f0f40 BSONDeserializer::DeserializeValue(BsonType, bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
13: 0x7ff7eb5f0946 BSONDeserializer::DeserializeDocumentInternal(bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
14: 0x7ff7eb5f0b97 BSONDeserializer::DeserializeDocument(bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
15: 0x7ff7eb5f3bcf  [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
16: 0x7ff7eb5f4519  [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
17: 0x7ff7f25536ba  [/lib/x86_64-linux-gnu/libpthread.so.0]
18: 0x7ff7f228941d clone [/lib/x86_64-linux-gnu/libc.so.6]

其他事件也会触发向工作人员发送消息。系统是Ubuntu 16.04和节点V10.15.3

在节点中,什么是找出导致此问题的最佳方法?

1 个答案:

答案 0 :(得分:0)

想到两件事。

  1. 如果您将调试窗口保持打开状态,则取决于应用程序,垃圾收集可能会停止,从而导致此类问题。通过 OpenCV 的视频等艰苦的工作流程让我好几次出局。
  2. setInterval() 我相信,不会在乎内部代码是被执行还是阻塞(也就是说,在不应该阻塞的时候阻塞或者阻塞太久)。 如果阻塞超过 250 毫秒,您将构建堆栈。

也许这样的代码会给你更好的调试体验,如果 postMessage 停止,你就不会建立堆栈:

function doIt() {
  mywebworker.postMessage('hello');
  setTimeout(function() {
     doIt();
  },250);
}
doIt();