我正在运行 Rails 应用服务器。我的设置是:
- Apache 2,使用 mod_ssl 作为 https 和 ssl 客户端证书
- Phusion 乘客 5
- Rails 4
- Ruby 2.1
我使用 NewRelic 来监控正在运行的应用程序。我最近启用了对请求排队延迟的监控,主要是出于好奇。我惊讶地发现请求队列中的延迟通常与实际的 ruby 代码和数据库执行时间一样长甚至更长。~200 毫秒似乎很高,对吧?
大多数在线信息表明,这种情况发生在请求队列等待工作器可用时,但事实并非如此。如下所示,我们几乎没有使用我们配置的实例。在高峰期,我们的利用率很少超过 30%。
其他几点说明:
- Apache 和 Passenger 位于同一台服务器上,因此不会因系统时钟不同步而出现错误计时问题。
- 至于 SSL 处理,Apache 会获取客户端 SSL 证书并将其作为标头附加到请求中。然后,rails 应用程序会处理其余的处理。
这可能是什么问题?
答案1
200 毫秒似乎并不那么糟糕。“请求排队”指标是 Web 服务器记录请求和 New Relic 代理加载(之后before_filters
)之间的时间度量。测量方式可能会使问题看起来像是存在,但实际上并不存在。您的延迟很好且均匀,没有峰值表明您缺少工作者或资源/CPU 不足。您可以使用来watch passenger-status
检查这一点。您还可以使用 Linux 实用程序在本地仔细检查服务器的资源使用情况:
top, iotop, vmstat, sar (systat)
还想寻找优化?检查 New Relic 代理之前执行的任何内容。可能的痛点:
这需要一些挖掘。祝你好运!