在 New Relic 中,它们作为应用程序响应时间的一部分显示的指标之一是“请求队列”。:
要收集请求排队时间,您需要在排队开始时为 HTTP 请求标记时间戳。[1]
这是通过在 Apache httpd.conf 中添加一个 HTTP 标头来完成的:
RequestHeader set X-Request-Start "%t"
Run Code Online (Sandbox Code Playgroud)
New Relic 提到:
对于请求队列桶,站点运营商可以提供更多的应用实例。
然而,我们已经看到添加新的应用程序实例(即 web 节点)不会影响请求排队时间 - 它保持不变。我们看到这大约是 250 毫秒。
哪些因素会影响请求队列长度,如何减少?
[1] http://support.newrelic.com/help/kb/features/tracking-front-end-time
我认为最好的方法是增加 Apache Config 中的“服务器限制”和“最大客户端”参数
这决定了 Apache 可以同时处理多少线程。如果您的“Max Clients”值为 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 等。
作为附加组件,在您的问题中,您说“网络节点”,我认为您将 Apache 用作这些节点的前端负载均衡器/代理服务器是否正确?如果是这样,我建议您测试诸如 NGINX、Varnish、HAProxy 等之类的东西,因为它们更适合做这样的事情并处理同时连接。
--
编辑:
我认为这可能会让您对前端 LB 服务器感兴趣。
我们使用 Apache 作为前端代理,代理分布在两台服务器上的 16 个应用程序节点。代理服务器在四核 Intel Core i5 服务器上运行(因此绝不低于规格)。我们开始注意到每秒请求数和响应时间之间的抛物线关系。在每秒大约 2000 个请求时,CPU 负载会猛增,每个响应大约需要 800 毫秒才能完成,3000 r/s 时每个响应大约需要 2 秒。我们切换到 NGINX,我们已经达到了 5000 r/s,而平均延迟仅增加了大约 50 毫秒,CPU 负载是 Apache 的四分之一。
显然,这完全取决于你的情况、你在做什么以及你有哪些可用资源,但我只是想我会给你我的看法 =)
归档时间: |
|
查看次数: |
9784 次 |
最近记录: |