我只是想把这个扔进去,即使这个特定的问题似乎已经回答了。我从 New Relic 和 Engine Yard 的人那里找到了这篇博文:博文。
这里的tl;dr是 New Relic 中的请求排队不一定是请求实际上在队列中排队并且无法得到处理。由于 New Relic 是如何计算这个指标的,它本质上是读取 nginx 在标头中设置的时间戳,并从Time.now
New Relic 方法获取它时减去它。然而,New Relic 会在你的代码的任何钩子被调用后运行。before_filter
因此,如果您在这些before_filter
s 中运行大量计算密集型或数据库密集型代码,那么您看到的可能实际上是请求延迟,而不是排队。
您实际上可以检查队列以查看其中的内容。如果您使用Passenger,这真的很简单——只需passenger status
在命令行上输入。这将向您显示有关每个乘客工作人员的大量信息,包括队列中的请求数量。如果您使用前面的 with 运行watch
,该命令将每 2 秒执行一次,因此您可以看到队列如何随时间变化(因此只需执行watch passenger status
)。
对于 Unicorn 服务器,这有点困难,但有一个可以运行的 ruby 脚本,可在此处获得。该脚本实际上检查了独角兽套接字中有多少请求等待工作人员接收。因为它正在检查套接字本身,所以运行此命令的频率不应超过 ~3 秒左右。GitHub 上的示例使用 10。
如果您看到大量排队请求,那么添加水平扩展(通过 Heroku 上的更多 Web 工作者)可能是一个合适的措施。但是,如果队列很低,但 New Relic 报告请求队列很高,那么您实际上看到的是请求延迟,您应该检查您before_filter
的 s,或者将它们的范围仅限于那些绝对需要它们的方法,或者继续工作优化那些过滤器正在执行的代码。
我希望这对以后来这个线程的人有所帮助!