首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最大并发HttpWebRequests数

问最大并发HttpWebRequests数
EN

Stack Overflow用户
提问于 2009-09-01 10:48:44
回答 4查看 65.4K关注 0票数 66

我正在对一个web应用程序进行压力测试,并且已经设置了一个windows测试程序,该程序会启动一些线程,并在每个线程上发送一个web请求。

问题是我得到了以下输出:

代码语言:javascript
复制
01/09/09 11:34:04 Starting new HTTP request on 10
01/09/09 11:34:04 Starting new HTTP request on 11
01/09/09 11:34:04 Starting new HTTP request on 13
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 15
01/09/09 11:34:06 Starting new HTTP request on 11
01/09/09 11:34:06 11 has finished!
01/09/09 11:34:06 Starting new HTTP request on 14
01/09/09 11:34:06 14 has finished!

这看起来最多有5个线程,即使我这样创建了100个线程:

代码语言:javascript
复制
int numberOfThreads = Convert.ToInt32(txtConcurrentThreads.Text);

    List<BackgroundWorker> workers = new List<BackgroundWorker>();

    for (int N = 0; N < numberOfThreads; N++)
    {

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        workers.Add(worker);
    }


    foreach(BackgroundWorker worker in workers)
    {
        worker.RunWorkerAsync();
    }

有谁能告诉我到底是怎么回事?

谢谢

编辑:如果我像建议的那样休眠5秒,而不是httpwebrequest,那么我确实会得到更多的线程触发,但没有我预期的那么多:

代码语言:javascript
复制
01/09/09 11:56:14 Starting new HTTP request on 7
01/09/09 11:56:14 Starting new HTTP request on 11
01/09/09 11:56:15 Starting new HTTP request on 12
01/09/09 11:56:15 Starting new HTTP request on 13
01/09/09 11:56:16 Starting new HTTP request on 14
01/09/09 11:56:16 Starting new HTTP request on 15
01/09/09 11:56:17 Starting new HTTP request on 16
01/09/09 11:56:17 Starting new HTTP request on 17
01/09/09 11:56:18 Starting new HTTP request on 18
01/09/09 11:56:19 Starting new HTTP request on 7
01/09/09 11:56:19 7 has finished!
01/09/09 11:56:19 Starting new HTTP request on 11
01/09/09 11:56:19 11 has finished!
01/09/09 11:56:19 Starting new HTTP request on 19
01/09/09 11:56:20 Starting new HTTP request on 20
01/09/09 11:56:20 Starting new HTTP request on 12
01/09/09 11:56:20 12 has finished!

看起来我每秒只能启动2个线程,这对我来说似乎非常慢。我想Console.WriteLine可能是个问题吧?

编辑:我设置

代码语言:javascript
复制
ThreadPool.SetMinThreads(100, 4); 

和

代码语言:javascript
复制
System.Net.ServicePointManager.DefaultConnectionLimit = 100;

并得到以下结果:

代码语言:javascript
复制
01/09/09 14:00:07 Starting new HTTP request on 11
01/09/09 14:00:07 Starting new HTTP request on 81
01/09/09 14:00:07 Starting new HTTP request on 82
01/09/09 14:00:07 Starting new HTTP request on 79
01/09/09 14:00:07 Starting new HTTP request on 83
01/09/09 14:00:07 Starting new HTTP request on 84
01/09/09 14:00:07 Starting new HTTP request on 85
01/09/09 14:00:07 Starting new HTTP request on 87
01/09/09 14:00:07 Starting new HTTP request on 88
...
01/09/09 14:00:07 84 has finished! Took 323.0323 milliseconds
01/09/09 14:00:08 88 has finished! Took 808.0808 milliseconds
01/09/09 14:00:08 96 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 94 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 98 has finished! Took 801.0801 milliseconds
01/09/09 14:00:08 80 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 86 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 92 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 100 has finished! Took 812.0812 milliseconds
01/09/09 14:00:08 82 has finished! Took 1010.101 milliseconds

因此能够同时推送出大量的web请求。它似乎在排队(呼叫STA COM+服务器),所以这就是我所期望的。

谢谢你的帮忙

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-01 10:51:55

您的所有(或大部分)请求是否碰巧都发往同一主机?每台主机都有一个内置的限制。您可以在system.Net connectionManagement元素的app.config中对其进行更改。

另一件事是线程池只会逐渐增加它的线程数量-它每半秒启动一个新线程,IIRC。这就是你所看到的吗?试着把HttpWebRequest从等式中去掉--只需要睡几秒钟……

我怀疑后一个问题是您最初遇到的问题,但第一个问题也会给您带来问题。

票数 74
EN

Stack Overflow用户

发布于 2009-09-01 11:27:49

同时传出HTTP连接的数量有限制。我认为您可以在创建HttpWebRequest对象之前使用System.Net.ServicePointManager.DefaultConnectionLimit静态属性来控制这一点。

票数 57
EN

Stack Overflow用户

发布于 2017-10-24 16:11:56

我没有听说过太多关于.NET核心的事情。ServicePointManager没有包含在.NET核心1中,但在版本2中似乎又回来了。但是,对于HttpClient,您也可以像这样设置最大连接数:

代码语言:javascript
复制
new HttpClient(new HttpClientHandler
                {
                    MaxConnectionsPerServer = 100
                })
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1361771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档