在 New Relic 中,作为应用程序响应时间的一部分显示的指标之一是“请求队列”:
为了收集请求排队时间,您需要在排队开始时用时间戳标记 HTTP 请求。[1]
这是通过在 Apache httpd.conf 中添加 HTTP 标头来完成的:
RequestHeader set X-Request-Start "%t"
New Relic 提到:
对于请求排队桶,站点运营商可以提供更多的应用程序实例。
然而,我们发现添加新的应用程序实例(即 Web 节点)不会影响请求排队时间 - 它保持不变。我们测量到该时间约为 250 毫秒。
哪些因素影响请求队列长度以及如何减少请求队列长度?
[1]http://support.newrelic.com/help/kb/features/tracking-front-end-time
答案1
我认为最好的方法是增加 Apache 配置中的“服务器限制”和“最大客户端”参数
这决定了 Apache 可以同时处理多少个线程。如果“最大客户端”值为 100,则 Apache 可以同时处理最多 100 个请求。
可能还值得注意的是,Apache 适用于小文件(文本,可能是 CSS/JS 等),但不太适用于大文件,如图像、视频、flash 等。这是因为每个文件都需要一个新请求(除非您使用 Keep-alive,但这不会有太大改善)。因此,如果您有一个包含 49 个外部资源(总共 50 个请求)的页面,需要 1 秒钟才能加载,并且您的最大客户端设置为 100,则在请求开始排队之前,您每秒只能处理两次页面浏览。
您可以通过多种方式解决这个问题,尝试将您的内容卸载到 CDN(定价从大约 0.10 美元/GB 开始,但如果您的数据传输量很大,可能值得联系 Edgecast 或 Akami,因为他们的批量定价要便宜得多)。这意味着您的服务器不必担心加载页面所需的任何静态资源,因此在我们上面的示例中,在请求开始排队之前,您现在每秒可以浏览 100 个页面。
如果您不想花钱购买 CDN,我建议您在服务器上获取两个 IP,一个连接到 Apache,另一个连接到 NGINX。NGINX 是一款性能极高的服务器,能够处理比 Apache 多数千倍的连接,NGINX 不像 Apache 那样使用请求排队,因为它是非阻塞的。不幸的是,NGINX 不具备 Apache 的所有功能,例如,您不能直接通过 NGINX 运行 PHP,而无需代理到 Apache/FCGI/HipHop 等。
补充一点,您在问题中提到了“Web 节点”,我认为您使用 Apache 作为这些节点的前端负载均衡器/代理服务器,对吗?如果是这样,我建议您测试 NGINX、Varnish、HAProxy 等,因为它们更适合做这样的事情和处理同时连接。
--
编辑:
我认为这可能让您对前端 LB 服务器感兴趣。
我们使用 Apache 作为前端代理,代理分布在两台服务器上的 16 个应用程序节点。代理服务器在四核 Intel Core i5 服务器上运行(因此绝不低于规格)。我们开始注意到每秒请求数和响应时间之间的抛物线关系。在每秒约 2000 个请求时,CPU 负载会急剧上升,每个响应大约需要 800 毫秒才能完成,在每秒 3000 个请求时,每个响应大约需要 2 秒。我们切换到 NGINX,我们达到了 5000 个请求/秒,同时平均延迟仅增加约 50 毫秒,CPU 负载是 Apache 的四分之一。
显然,这完全取决于您的情况、您正在做什么以及您有哪些可用资源,但我只是想给您我的看法 =)
答案2
我必须问一个显而易见的问题:文档指出您应该使用 http 标头 X-Queue-Start(或 X-Queue-Time),但您提到您正在使用 X-Request-Start。您添加的标头正确吗?