多线程Web请求性能问题



我想使用多线程Web请求,但我没有得到我期望的性能。

我用4个内核运行,带有1 Gbps上传和1 Gbps下载。

对于测试,我正在下载Google主页。

Google页面的数据大小约为50 kb。

我正在同时发送1000个请求,除了在〜2秒内完成所有请求,但要完成20秒以上才能完成

我的代码看起来像这样:

        bool success = ThreadPool.SetMinThreads(workerThreads: 2000, completionPortThreads: 1000);
        success = ThreadPool.SetMaxThreads(2000, 2000);
        DateTime dt = DateTime.UtcNow;
        Parallel.For(0, 1000, (num) =>
        {
            string url = "https://www.google.co.il/?gfe_rd=cr&dcr=0&ei=OZy3WcmoMY7b8Affj4F4&gws_rd=ssl";
            using (WebClient web = new WebClient())
            {
                byte[] bytes = web.DownloadData(url);
            }
        }
        );
        double sec = (DateTime.UtcNow - dt).TotalSeconds;
        Console.WriteLine(sec);

我认为您的情况下的更好选择是使用HttpClient具有显式异步操作,让Windows管理线程池本身。

Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
    var httpClient = new HttpClient();
    results[i] = httpClient.GetByteArrayAsync(@"https://www.google.co.il/?gfe_rd=cr&dcr=0&ei=OZy3WcmoMY7b8Affj4F4&gws_rd=ssl");
}
var status = Task.WhenAll(results); //WhenAny if you can process results independently
var pages = status.Result;
sw.Stop();
double sec = sw.Elapsed.TotalSeconds;
Console.WriteLine(sec);

旁注:请考虑使用Stopwatch进行时间测量。

解决方案是:

        System.Net.ServicePointManager.DefaultConnectionLimit = int.MaxValue;

最新更新