【问题标题】:Web service concurrent calls processingWeb服务并发调用处理
【发布时间】:2013-11-09 09:18:06
【问题描述】:

我遇到了与 Web 服务请求处理相关的下一个问题:

序言
我有

  • 在本地计算机上的 IIS 7.0 上托管的 Web api 服务
  • 在同一台机器上测试线束控制台应用程序

我正在尝试通过测试工具应用程序生成的请求来模拟 Web 服务负载。 测试工具核心代码:

    static int HitsCount = 40;

    static async void PerformHitting()
    {
        {
            await Task.WhenAll(ParallelEnumerable.Range(0, HitsCount)
                                                 .Select(_ => HitAsync())
                                                 .WithDegreeOfParallelism(HitsCount));
        }
    }

    static async Task HitAsync()
    {
        // some logging skipped here
        ...
        await new HttpClient().GetAsync(TargetUrl, HttpCompletionOption.ResponseHeadersRead);
    }

期待
日志显示所有 HitAsync() 调用是同时进行的:通过 HttpClients 的每次命中都开始于
[0s; 0.1s]时间范围(时间在这里和下面大致四舍五入)。因此,我希望在 Web 服务端几乎在同一时间范围内捕获所有这些请求。

现实
但是在服务端登录显示,请求分组为 8-12 个请求,每个请求和服务以约 1 秒的间隔捕获这些束。我的意思是:

[0s, 0.3s] <- requests #0-#10
[1.2s, 1.6s] <- requests #10-#20
...
[4.1s, 4.5s] <- request #30-#40

对于任何重要的HitCount 值,我的执行时间都非常长。

问题
我怀疑某种内置的服务节流机制或框架内置的并发连接限制。只有我发现与这种猜测相关的是that,但我没有从那里尝试解决方案取得任何成功。
有什么想法吗?

谢谢。

【问题讨论】:

  • 在了解负载测试工具的工作原理时,构建负载测试工具是一种很好的做法,但使用现有工具完成此类工作几乎总是更有效率。以SoapUI 为例(有几个)。

标签: c# asp.net-web-api


【解决方案1】:

默认情况下,ASP.NET 上的 HTTP 请求限制为内核数的 12 倍。我建议将ServicePointManager.DefaultConnectionLimit 设置为int.MaxValue

【讨论】:

  • 您好斯蒂芬,感谢您的回复。我尝试在测试工具端和 Web 服务端更改 ServicePointManager.DefaultConnectionLimit 的值。我可以在调试下看到ServicePointManager.DefaultConnectionLimit 确实发生了变化,但服务仍然只能捕获约 10 个并发请求。
  • 只要你在第一次请求之前设置它,你不应该被限制在你的客户端。你对服务器端有什么限制吗?
  • 我在服务器端设置的限制与在客户端完全相同。正如我所看到的,对于像here 这样的限制设置和像DefaultConnectionLimit = 1 这样的限制,结果是相同的。在machine.config 中设置processModel.maxIoThreads 也没有任何结果。 [UPD] 我错了。在服务器端的运行时(而不是配置)中设置 DefaultConnectionLimit = 1 会改变行为:我收到前 10 个请求,其余 1 个前一秒
【解决方案2】:

嗯,问题的根源在于 IIS + Windows 7 并发请求处理限制(有关此类限制的一些信息here。将服务移到装有 Windows Server 的机器上就解决了问题。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多