Node.js:如何确定服务器挂起的原因

时间:2017-02-17 20:47:57

标签: javascript node.js

我最近开始注意到我的Node.js应用服务器在多次请求后挂起。经过更多调查后,我将其缩小到一个特定的终点。在此端点上大约30次点击后,服务器只是停止响应并请求开始超时。

总之,在每个请求上,客户端上传文件,服务器执行一些初步检查,创建新的处理作业,使用bull将其放入队列,然后向客户端返回响应。然后,服务器继续处理队列上的作业。作业过程涉及从Redis数据库检索作业数据,客户端打开WebSocket连接以检查作业状态,以及在作业完成后服务器写入数据库。我知道其中任何一件事都可能导致挂断。

不会抛出或记录任何错误或异常。我只看到请求开始超时。我正在使用节点检查器来试图找出导致挂起的原因但不确定要查找的内容。

我的问题是,有没有办法确定挂断的根本原因,使用调试器或其他方法,找出已创建的ABC个实例太多,或者XYZ array_of_hashes = [{"a_0_abc"=>"1", "a_0_def"=>"1", "a_0_hij"=>"1",}, {"a_1_abc”=>"2", "a_1_def"=>"2", "a_1_hij"=>"2"}] 连接是开放的。

3 个答案:

答案 0 :(得分:2)

可以使用以下工具完成许多节点服务器调试。

Nodemon 是一个很好的调试工具,因为它会像节点一样显示错误,但它也会尝试根据新的更改重启服务器;删除了很多停止/启动hastle。 https://nodemon.io/

最后我会推荐 Postman 。 Postman允许您手动将请求发送到您的服务器,并将帮助您缩小搜索范围。 https://www.getpostman.com/

答案 1 :(得分:0)

在这种情况下,它实际上并不是Node.js特有的问题。我在一个代码路径中泄漏了数据库连接。我学到了很多困难,如果耗尽数据库连接,您的节点服务器将停止响应。请求似乎挂了。

在Postgres上追踪此问题的好方法至少是运行查询:

SELECT * FROM pg_stat_activity

其中列出了所有打开的数据库连接,以及上次在该连接上运行的查询。然后,您可以检查代码中查询的位置,这对于追踪泄漏非常有帮助。

答案 2 :(得分:0)

根据我的经验,有关OP的问题和解决方案:

如果您正在使用 mysql 库并获得特定的连接connection.getConnection(...),则需要记住之后connection.release();

释放它

否则,您的池将耗尽连接,并且进程将挂起。