我们有一个使用 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 对象上的缓冲流有关,以及可以做些什么来纠正这个问题?
编辑
一直在玩这个,但仍然没有找到答案。
做过的事情:
将虚拟文件夹从实际站点文件夹的子文件夹位置移出(该站点下大约有 11 个其他 Web 服务)
分配此 Web 服务以使用其自己的应用程序池,因此它不会与主站点和站点下的其他 Web 服务共享
按照 Phil 的建议,向 Web.Config 添加了使用 Server GC 的要求
禁用启用缓冲流使用的预请求过滤器(并绕过使用 RawBody 的代码)
为 New Relic 添加了更多仪器以进行更好的钻取(见下图)
我开始怀疑这是否是由于负载导致的 Windows Server/IIS 限制。但想听听更熟悉的人的意见。