基准测试ASP.NET并发请求效果不佳

时间:2015-12-10 00:44:43

标签: asp.net iis asp.net-web-api

我有以下代码,我使用jMeter进行基准测试,并在我的localhost机器上每秒获得大约3000个请求(def initUI(self): calculateBtn = QtGui.QPushButton("Calculate", self) calculateBtn.clicked.connect(self.calculate_btn_on_click) self.earningsTextbox = QtGui.QLineEdit(self) self.show() def calculate_btn_on_click(self): self.earningsTextbox.setText("42") 故意无法同步运行):

await

问题是,当我暂停请求一秒钟时,如下所示,由于某种原因,每个w3wp.exe进程的吞吐量降至每秒10个请求(同样,public async Task<HttpResponseMessage> Get() { var resp = new HttpResponseMessage(HttpStatusCode.OK); resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain"); return resp; } 有意失去同步运行):

await

即使我使用public async Task<HttpResponseMessage> Get() { Task.Delay(1000).Wait(); var resp = new HttpResponseMessage(HttpStatusCode.OK); resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain"); return resp; } 也没有区别,每秒10个请求根本没有改善:

await

我尝试了所有的配置设置,没有任何改变: `

  

的web.config

public async Task<HttpResponseMessage> Get()
{
    await Task.Delay(1000);
    var resp = new HttpResponseMessage(HttpStatusCode.OK);
    resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain");
    return resp;
}
  

aspnet.config

  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="65400" />
    </connectionManagement>
  </system.net>
  

machine.config中

  <system.web>
    <applicationPool 
        maxConcurrentThreadsPerCPU="100" />
  </system.web>

为x86和x64设置配置

我有32个内存和4个物理内核,Windows 10.

当每秒调整10个请求时,CPU的负载不会超过10%。

上面的代码使用WEB API,但我当然使用HTTP Handler重现相同的结果。

2 个答案:

答案 0 :(得分:2)

这是一种可能的理解。无论如何,一个要调查。

Task.Delay()创建一个新任务,其任务是暂停。如果我理解正确,通常会将任务分派到.Net工作池,该工作池的大小有限。 (您可以查看ThreadPool.GetMaxThreads)当您尝试过多时,代码将会“备份”。因为它等待线程池有空间。

因此,假设您有一个大小为40的线程池。一旦您发送了40个任务,所有等待一秒钟,您就会最大化线程池。你的瓶颈就是任务,弄乱线程池,而不是产生空间。

通常,执行昂贵IO(如数据库查询或文件IO)的任务会在等待工作完成时产生控制权。我想知道Task.Delay是否更加“紧贴”。

尝试交换System.Threading.Thread.Sleep()的Task.Delay(),看看是否有任何改变。

答案 1 :(得分:1)

我知道对于Windows 8,最大并发连接限制为10,以阻止人们尝试使用消费者操作系统来运行服务器工作负载。 我认为没有理由为什么Windows 10会有所不同。

http://blogs.iis.net/owscott/windows-8-iis-8-concurrent-requests-limit