如何在短时间内调用大量http请求

Posted

技术标签:

【中文标题】如何在短时间内调用大量http请求【英文标题】:How to call large number of http requests in a short period of time 【发布时间】:2015-11-26 21:31:39 【问题描述】:

我必须每隔几秒发送 100,000 个 http 请求,使用下面提供的代码,发送请求需要 19 秒,并且比我的间隔时间长。

在此期间 CPU 使用率和以太网使用率是 100% 。我在双处理器电脑上试过,带宽更高,但结果一样。

有没有其他方法可以提高性能。

protected async void btnStartCallWhenAll_Click(object sender, EventArgs e)

    t1 = DateTime.Now;
    // Make a list of web addresses. 
    List<string> urlList = SetUpURLList(Convert.ToInt32(txtNoRecordsToAdd.Text));

    // One-step async call. 
    await ProcessAllURLSAsync(urlList);

    t2 = DateTime.Now;
    double spent = t2.Subtract(t1).TotalMilliseconds;
    txtTimeElapsed.Text = " Time Spent :" + spent.ToString() ;

private List<string> SetUpURLList(int No)

    List<string> urls = new List<string>
    
    ;

    for (int i = 1; i <= No; i++)
        urls.Add("http://msdn.microsoft.com/library/windows/apps/br211380.aspx");

    return urls;

private async Task ProcessAllURLSAsync(List<string> urlList)

    ServicePointManager.UseNagleAlgorithm = true;
    ServicePointManager.Expect100Continue = true;
    ServicePointManager.CheckCertificateRevocationList = true;
    ServicePointManager.MaxServicePointIdleTime = 10000;
    ServicePointManager.DefaultConnectionLimit = 1000;

    IEnumerable<Task> CallingTasksQuery =
        from url in urlList select CallURLAsync(url);

    Task[] CallingTasks = CallingTasksQuery.ToArray();

    await Task.WhenAll(CallingTasks);


private async Task CallURLAsync(string url)

    var content = new MemoryStream();
    var webReq = (HttpWebRequest)WebRequest.Create(url);
    using (WebResponse response = await webReq.GetResponseAsync())
    
    

【问题讨论】:

100'000 个 http 请求对于单个 tcp 堆栈来说已经很多了,你确定不是网卡的问题吗? 你在什么操作系统上运行它?您是否考虑过在不止一台物理机之间进行分区?您应该考虑到网络或 Web 服务器也可能是问题所在,互联网只是这么快,30-50 毫秒的响应时间(快速)乘以 100,000 个请求意味着需要一些时间才能完成。 @RonBeyer 有你的答案,你需要的是多台机器,而不是单个双核机器。如果我没记错的话,tcp堆栈是cpu和网卡绑定的。实现 100k 请求的唯一方法是将请求分段到不同的机器上。在某些时候,您的网络也会受到影响,您的连接上传速度也会成为瓶颈。 100,000 * 1246 KB(平均大小的网页)网络请求是 124.6 GB,在 19 秒内下载该带宽是相当大的带宽,更不用说问题说这太慢了。我不得不假设这些是几个字节的网络请求,而不是 https 网页请求。此外,列出的代码使用 DateTime.Now 并构建包含在计时中的相同 url 的循环。这不能代表使用准确时间的不同网络调用。 “这段时间CPU使用率和以太网使用率都是100%”,显然这对系统来说太多了 【参考方案1】:

参考HttpWebRequest is extremely slow!

确保您已设置:

webReq.Proxy = null;

看起来好像 WebRequest 的启动会寻找默认代理。

【讨论】:

以上是关于如何在短时间内调用大量http请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用jMeter发送两个逻辑上相关的HTTP请求

如何使用jMeter发送两个逻辑上相关的HTTP请求

如何在 Firebase 中存储大量 HTML 文件并通过 http 请求提供服务?

java调用Http请求 -HttpURLConnection学习

如何在几秒钟内发送 50.000 个 HTTP 请求?

(第三章,第四章)http报文内的http信息,返回结果的http状态码