节点同时在多个请求上崩溃

时间:2016-09-01 15:17:41

标签: node.js

我写了一个npm包StubbyDB,在加载测试的情况下无法正常运行。

总结:当HTTP请求到来时 - >它读取相关文件 - >处理文件内容 - >回复客户。

我从文件中异步读取内容。当我运行负载测试时,StubbyDB在控制台上崩溃并显示以下消息。

node: ../src/tcp_wrap.cc:61: static v8::Local<v8::Object> node::TCPWrap::Instantiate(node::Environment*, node::AsyncWrap*): Assertion `(instance.IsEmpty()) == (false)' failed.
Aborted (core dumped)

由于这不是异步文件读取的正确用例,如this ans中所述,我将代码更改为同步读取文件。它改善了性能。但是现在它因为以下原因而中止

node: ../deps/uv/src/unix/async.c:130: uv__async_io: Assertion `n == sizeof(val)' failed.

由于我删除了所有异步调用,我没想到它。但不知何故,我发现如果我禁用日志记录(使用winston npm包),那么这个问题就不会出现了。所以我禁用了日志记录。

它提高了更多。但现在它与Segmentation fault (core dumped)崩溃了。我试过多次重建npm。但仍然是同样的问题。现在可能是什么原因?

有时它会与

崩溃
*** Error in `node': corrupted double-linked list: 0x0000000002e994f0 ***
Aborted (core dumped)

1 个答案:

答案 0 :(得分:1)

我通过2次更改解决了第一个问题

  1. 我将所有异步调用转换为同步。因为只有在应用程序中有一些可以并行运行的代码时,异步调用才有用。否则,每次回调都会增加内存使用量。

  2. 我有一个延迟功能,我使用的是npm库:desync,用于阻止指定时间段的呼叫。由于我在启动时使用它,因此之前创建的所有变量都不能被垃圾收集。所以我在最后调用了这个调用并使用了setTimeout()。在这一点上,NVM可以很容易地找出哪些变量没有被引用,因此它们可以很容易地被垃圾收集,因为setTimeout不会中断执行并让线程继续运行。

  3. 对于第二个问题,我在运行负载测试时关闭了日志记录。由于它是第三方图书馆,我不会分析太多。

    由于内存泄漏,最后出现问题。最初的2个修复程序显着解决了它。另外,这次我照顾好了;

    • 我停止将带有大数据的变量传递给任何回调。
    • 我们在完成工作后立即释放这些变量,而不是在应用程序结束时使用它们。所以它们可以被垃圾收集。