2012-01-26 91 views
3

对我的Node.js HTTPS服务器发出的POST或PUT请求大约有10%需要2分钟才能得到响应。其他90%的行为如预期。随机POST或PUT请求上的2分钟延迟

我已经通过tshark验证过请求的主体是否被服务器接收到,但是这需要2分钟来触发ServerRequest对象的'data'和'end'事件。

遇到此延迟的请求看起来是随机的,但是当它发生时,接收数据包与触发'数据'和'结束'事件之间的延迟时间总是恰好2分钟。

对于所有这些请求,我发布了一个到达单个数据包的小json对象。对于遇到延迟的请求,我知道我的应用程序收到了头文件,因为会话cookie是立即分析的。在会话认证之后,直到'数据'和'结束'事件终于在2分钟后发出,此时身体被解析并保存到我的数据库才会发生任何事情。

这是否更有可能成为我的Node应用程序的问题,或者是与我的服务器(运行Amazon Linux的EC2小型实例)有关的问题?它是如何从包含请求正文的数据包到达之前2分钟,直到它作为一个块传递给我的应用程序?

谢谢。

更新: 我修改了lib/http.js中的parser.onBody来记录'b',我可以看到这个方法直到两分钟延迟结束才被调用。这似乎表明问题比我的应用程序更低。我也更改了ec2实例,但这没有帮助。

+0

这是一致的2分钟吗?对这些请求做了多少工作?任何与垃圾收集有关的机会? http://stackoverflow.com/questions/5603011/node-js-and-v8-garbage-collection – 2012-01-27 07:45:58

+0

是的,每次只有两分钟。没有太多的工作 - 我附加一个解析的url,解析会话cookie并附加一个来自redis的会话对象。我从来没有看到任何延迟。我不认为它是垃圾收集,因为我可以继续接收其他的正常请求,而一个卡住。 – 2012-01-27 15:22:36

回答

1

我只是在认证后才听'数据'事件。我在认证后在回调中有req.on('data', function(chunk) {req.body += chunk});,而不是在主侦听器功能中。在我开始收听之前,通常是有效载荷到达的。

+0

感谢您发布更新Andrew – 2012-01-29 12:20:45

3

如果不知道节点应用程序对每个请求所做的确切事情,很难说。例如,如果它必须与另一个后端服务交谈,则与仅从内存中提取内容的图像稍有不同。

话虽如此,EC2小实例可能会非常激动人心。他们与其他客户大量共享,所以有时他们可能会变得无法回应。有一种方法可以在EC2实例的命令行中运行'top'。寻找窃取的列%st。如果高,那很糟糕,请切换到新的EC2实例。 (或得到一个更大的)