性能测试 API - WebClient.DownloadData 异步问题

本文关键字:异步 问题 DownloadData WebClient API 性能测试 | 更新日期: 2023-09-27 18:32:41

我正忙于通过并行并发调用加载它来在我们的公共 API 上进行性能测试。 下面的代码。

int batchSize = 10;
ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = batchSize;
Parallel.For(0, batchSize, parallelOptions, j =>
{
    Debug.WriteLine("Thread began at " + DateTime.Now.ToLongTimeString());
    using (WebClient client = new WebClient())
    {
        Stopwatch sw = Stopwatch.StartNew();
        byte[] arr = client.DownloadData("http://myapiurl/webservice.svc");
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds.ToString());
    }
});

但是我得到了奇怪的结果:

  • 从调试输出中,我可以看到所有线程都在同一时间启动(如预期的那样)。

  • 我还记录了从 Web 服务中处理 API 调用所花费的时间(这存储在日志表中)。每个电话大约在同一时间接听...约2.5秒。

  • 但现在控制台输出不相关。 我希望它只比 Web 服务记录的内容略长。输出:

2883 
2914 
5653 
5822 
8000 
8250 
10215 
10539 
11622 
12494

我可以想出以下可能的原因:

  • 就好像WebClient.DownloadData正在跨自身实例排队我的请求。

  • IIS 正在排队我的 Web 请求。 这是不可能的,因为没有其他东西击中 API。

性能测试 API - WebClient.DownloadData 异步问题

所有 HTTP 请求都由 ServicePointManager 审核,该服务管理器管理与各种主机的连接池。每个主机的并发连接(因此 HTTP 请求)有限制。这可以通过致电以下地址来增加:

ServicePointManager.FindServicePoint("http://myapiurl/webservice.svc")
    .ConnectionLimit = 100; //arbitrary value

还值得记住的是,HttpWebRequest 的 .Net 实现(WebClient使用的)永远不可能是真正的异步,因为 DNS 查找在异步发出请求之前同步发生。我一直认为这是一个完全迟钝的设计决策,它阻止了高性能的 http 请求(尤其是在爬取/爬网场景中)。