.Net Mvc 异步编程
关于在mvc/webapi 中 async/await 异步编程的探究和整理 你可以用双手玩转多个球
查看调试器windbg和sos.dll调试器扩展或挖掘W3SVC日志
设置minWorkerThreads来解决流量突发
总结相关论点
1.IIS执行原理和管道,IIS 在接受请求HTTP.sys ->IIS->CLR->IIS->Reponse。异步解决的是 IIS->CLR->IIS 的过程,IIS线程池 线程数量有限。
减少或降低对线程的阻塞是选择异步的重要原因
2.异步会带来线程切换的资源开销问题,而且一个CPU(核)只能处理一个线程。所以应当避免在耗费CPU的方法使用异步,这毫无收益并带来线程
切换的开销。
3.异步对网络和IO的长时间等待最为适用。如远程访问api,对本地文件资源的读取等耗时操作。并可以实现远程调用的超时取消机制。
4.数据库的访问是否适用异步操作? 这里存在争论
4.1 不适用,数据库通常就是系统瓶颈之所在。此举无非是将web的访问压力转移到数据库,而且在将数据库访问异步化之后会进一步加大数据库压力,因为web可接收的
访问变得更大了
4.2 适用,在4.1中忽略了一个系统并非所有请求都需要对数据库进行访问,但是由于部分访问数据库的请求长时间占用线程,导致站点整体响应能力变弱。数据库的事情让数据库
去解决。
HTTP.sys 内核队列 默认1000,在内存超过2G或更多的时候 可以将这个值设置到5000 以上,通过IIS 应用池高级设置 更改队列长度即可。
从IIS7开始加入MaxConcurrentRequestsPerCPU的注册表项 默认12 v4.0 开始 为5000 设置为0 请求将在IIS I/O上执行 不切换到CLR Treadpool
路径 DWORDHKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0
如果应用程序访问WebService/WCF/通过System.Net 访问Http 可以更改System.Net.ServicePointManager.DefaultConnectionLimit 此值可以设置得非常大,默认是12*#CPU,意味着4核心的服务器可以有48个并发连接,甚至可能需要修改TcpTimedWaitDelay和MaxUserPorts注册表值
https://blogs.msdn.microsoft.com/rickandy/2009/11/14/should-my-database-calls-be-asynchronous/