为什么我的请求排队时间这么高?

我正在运行一个Rails应用程序服务器。 我的设置是:

  • Apache 2,使用mod_ssl同时用于https和ssl客户端证书
  • Phusion乘客5
  • Rails 4
  • Ruby 2.1

我使用NewRelic来监视正在运行的应用程序。 我最近启用了请求排队延迟的监控,主要是出于好奇。 我惊讶地发现,请求队列中的延迟通常比实际的ruby代码和数据库执行时间长或长。 〜200毫秒似乎很高,对吧?

重要的请求队列延迟

大多数在线信息表明,当请求队列正在等待工作人员可用时会发生这种情况,但事实并非如此。 如下所示,我们几乎没有使用我们提供的实例。 在高峰期,我们很less超过30%的利用率。

工人实例的利用

其他一些说明:

  • Apache和Passenger驻留在同一台服务器上,所以不会因为系统时钟不同步而导致计时错误。
  • 关于SSL处理,Apache抓取客户端SSL证书,并将其附加为请求中的头部。 然后rails应用程序处理剩下的处理。

这里可能是什么问题?

200毫秒似乎并不可怕。 “请求排队”指标是衡量Web服务器logging请求和New Relic代理加载( before_filters之后)的时间间隔。 这种测量的方式可能会让人觉得有一个问题,当一个不存在的时候。 你的延迟是好的,甚至没有尖峰,这表明你正在耗尽工人或饿死资源/ CPU。 您可以使用watch passenger-status来检查。 您还可以使用Linux实用程序在本地重新检查服务器的资源使用情况:

top, iotop, vmstat, sar (systat)

仍然想要寻找优化? 查看在New Relic代理之前执行的任何内容。 可能的痛点:

  • before_filters / before_action
  • 机架中间件
  • 远程服务缓慢DBaaS,API,AWS服务
  • Web服务器configuration

这将需要一些挖掘。 祝你好运!