为探究到底是系统写的有问题,还是IIS本身的问题,我抛开我们的系统,写了一个简单的页面,就一个aspx文件,page_load里sleep 10秒。假设这就是一个性能比较差的网站,每个页面都要10秒才能展现,我将其部署在IIS上测试其性能,我使用的是Microsoft Web Application Stress Tool,模拟发起80个线程,每个连接有4个Socket,总共相当于320个并发请求。
测试开始后,可以从下图中看到,当前请求数立刻攀升到300左右(图中红线),然后队列中的请求数也上升到300左右(图中绿线),就是说在300个并发请求下,几乎所有的请求都被排队了,系统基本不可用,通过简单的测试,这个问题已经得以重现了
指令: perfmon.msc
解决方法列表:
方法1
对windows配置文件(C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config)进行了如下修改。注意都是针对单个CPU的,系统会自动乘以逻辑CPU的数量。
<system.web>
<processModel autoConfig="false" maxWorkerThreads="200" minWorkerThreads="50" />
相当于最小工作线程设置成了50*16=800
重启IIS后进行测试,得到了以下结果:
方法2
在IIS之后引入了一个新功能叫Web Garden,其设计目的是为了在CPU占用较低,但是并发请求数比较多的情况下,提升服务器性能。这正符合我当前的情况,于是我启用了Web Garden,将 “最大工作进程数” 从1调整到5,在任务管理器中可以看到w3wp进程从原来的1增加到了5,然后重新测试
与方法1中同样的请求下,可以看到除了一开始的几秒出现了一些排队,后面基本上表现良好,没有请求进入队列
最后:
通过以上两种方式,都可以有效解决本文开头提出的问题。但Web Garden是工作在多进程模式下,如果应用中用到了依赖进程的Session和Cache等对象都必须另想办法,不能保存在服务器内存中,而且Web Garden的多个进程切换时会有上下文复制,其资源消耗相对单进程要大,这些是需要考虑的因素。