我有以下代码,我使用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重现相同的结果。
答案 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