3

我们有一个使用 ServiceStack (v3.9.60) 的 Web 服务,目前平均(每个 New Relic 监控)每分钟 600 个请求(与两个 Windows 2008 Web 服务器进行负载平衡。)

在编码请求服务(包括请求过滤器)中花费的实际时间平均约为 5 毫秒(从我们从记录的 log4net 日志中看到的。)它正在将请求卸载到 ActiveMQ 端点并自动让 ServiceStack 生成 204(Return204NoContentForEmptyResponse 已启用带有“公共无效帖子(请求)”)

最重要的是,我们有:

PreRequestFilters.Insert(0, (httpReq, httpRes) =>
{
    httpReq.UseBufferedStream = true;
});

因为我们在请求过滤器期间使用原始正文来验证加盐的哈希值(作为自定义标头传递),出于批准的原因,它来自正确的来源。

总的来说,我们在 New Relic 中看到整个 Web 服务调用平均需要大约 700 毫秒,这与执行编码过程实际需要的 5 毫秒相比要多得多。因此,当我们深入研究 New Relic 报告的数据时,我们看到一些请求周期性地花费相当长的时间(每个请求 10-150 秒。)深入研究 New Relic 的报告,我们看到应用预请求过滤器需要时间(参见下图。)我们想知道为什么会出现这种情况,以及它是否与 Http Request 对象上的缓冲流有关,以及可以做些什么来纠正这个问题?

在此处输入图像描述

编辑

一直在玩这个,但仍然没有找到答案。

做过的事情:

  1. 将虚拟文件夹从实际站点文件夹的子文件夹位置移出(该站点下大约有 11 个其他 Web 服务)

  2. 分配此 Web 服务以使用其自己的应用程序池,因此它不会与主站点和站点下的其他 Web 服务共享

  3. 按照 Phil 的建议,向 Web.Config 添加了使用 Server GC 的要求

  4. 禁用启用缓冲流使用的预请求过滤器(并绕过使用 RawBody 的代码)

  5. 为 New Relic 添加了更多仪器以进行更好的钻取(见下图)

我开始怀疑这是否是由于负载导致的 Windows Server/IIS 限制。但想听听更熟悉的人的意见。

在此处输入图像描述

4

0 回答 0