性能测试 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。
所有 HTTP 请求都由 ServicePointManager 审核,该服务管理器管理与各种主机的连接池。每个主机的并发连接(因此 HTTP 请求)有限制。这可以通过致电以下地址来增加:
ServicePointManager.FindServicePoint("http://myapiurl/webservice.svc")
.ConnectionLimit = 100; //arbitrary value
还值得记住的是,HttpWebRequest 的 .Net 实现(WebClient
使用的)永远不可能是真正的异步,因为 DNS 查找在异步发出请求之前同步发生。我一直认为这是一个完全迟钝的设计决策,它阻止了高性能的 http 请求(尤其是在爬取/爬网场景中)。