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