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

Javascript Node.js:如何确定服务器挂起的原因,javascript,node.js,Javascript,Node.js,我最近开始注意到我的Node.js应用服务器在多次请求后挂起。经过更多的调查,我把范围缩小到一个特定的终点。在这个端点上点击大约30次后,服务器停止响应,请求开始超时 总之,对于客户机上传文件的每个请求,服务器都会进行一些初步检查,创建一个新的处理作业,将其放入队列中,使用,然后向客户机返回响应。然后,服务器继续处理队列上的作业。作业过程包括从Redis数据库中检索作业数据,客户端打开WebSocket连接检查作业状态,以及作业完成后服务器写入数据库。我知道这些事情中的任何一个都可能会导致挂断

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

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

没有引发或记录任何错误或异常。我看到的只是请求开始超时。我正在使用节点检查器来尝试找出导致挂起的原因,但不确定要查找什么


我的问题是,是否有一种方法可以使用调试器或其他方法确定挂起的根本原因,以找出创建了太多的
ABC
实例,或者打开了太多的
XYZ
连接。

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

Nodemon是一个很好的调试工具,因为它会像node一样显示错误,但它也会根据新的更改尝试重新启动服务器;移除许多停止/启动按钮。

最后我推荐邮递员。Postman允许您手动向服务器发送请求,并帮助您缩小搜索范围。

在本例中,它实际上不是Node.js特定的问题。我在一个代码路径中泄漏了一个数据库连接。我学到了一个艰难的方法,如果耗尽数据库连接,节点服务器将停止响应。请求似乎被搁置了

至少在Postgres上,追踪这一点的一个好方法是运行查询:

SELECT * FROM pg_stat_activity

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

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

如果您正在使用mysql库并获得一个特定的连接
connection.getConnection(…)
,您需要记住在以后释放它
connection.release()


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

谢谢您的提示。我已经用过nodemon和postman了。邮递员确实帮我隔离了对我无知的担忧,但“我泄露了一个数据库连接”是什么意思?我使用的是一个数据库连接池,它保存了一个连接池,我可以随时使用。每当我从池中检索连接,运行我的查询时,我都应该标记它已完成,并将连接返回到poo以供将来使用。否则将导致连接无法返回到池中,这意味着我最终将耗尽连接,从而导致应用程序挂起。我正在使用此池库: