IIS的工作原理的疑问

zhaoyabin 2012-10-30 12:35:24
本人刚刚从事asp.net开发,但是对IIS的工作原理还存在着一些疑问,特请教群里高手们:
1.在IIS7.0的网站管理里面,右键网站有个高级设置,里面有个最大并发数,这里的并发数指的是什么,因为所以的请求都会先经过http.sys处理,这里可不可以理解为http.sys在某一时刻所能承受的并发数?
2.一个应用程序池中可以包含多个站点,当http.sys接收到客户端的请求的时候,会选择对应的应用程序池,http.sys是否是单线程工作,如果是单线程工作,在网站访问量大的情况下是否会出现瓶颈问题?(因为我想http.sys也要做一些判断处理,性能肯定会有损耗)
3. http.sys会接收客户端的请求,会根据请求,选择对应的应用程序池,会将请求放在应用程序池的队列中去,默认的IIS7.0的队列长度是1000,这里的队列程序和前面提到的并发数之间是什么关系,应用程序池对应一个工作者进程,所有的处理都会在这里进行,会对不同的资源请求作出不同的相应,如果是asp.net,就会加载ISAPI,进而加载CLR,而CLR会创建APPDomain,然后开始处理请求,HttpRuntime>httpApplicationFactory>HttpAlication>,这是第一个请求做做的事情,我的问题是当第二个请求过来的时候,IIS会做哪些事情,w3wp是不是多线程运行的,如果是,线程池是多大,如何设置,怎么设置最合理,第二个asp.net请求过来的时候,会不会重复的去加载ISAPI,并行处理是怎么做的。
4.IIS6.0应用程序池里面有个资源回收,这里的回收,是回收w3wp的资源吗,具体的要回收哪些资源,为什么要回收,在我看来w3wp就是一个请求线程池,来循环的接收请求。

以上问题可能会问的比较怪,大家都什么高见,尽情发表吧。
...全文
454 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈尔滨-猫猫 2014-04-11
  • 打赏
  • 举报
回复
首先,你问的这些问题并不奇怪。别人没有问或者没有研究过这些问题,是因为大部分程序员以完成功能为主。能提出这些问题的人,我相信日后必能成为一名合格甚至优秀的程序员(注:不是某语言程序员)。 其次,目前来说,你这些问题我不一定都能回答正确,但有幸的是,我跟你一样,在能实现功能的情况下,我非常乐意研究其实现原理,以及实现细节,针对你的问题,我可以做一些自己的理解,有些问题,是我曾在调试ISAPI扩展遇到的,可以肯定的地方,我会加上标注,个人推测的结论也会加上标注,这些东西即便别人说出来了,自己体会依然不是很深刻,还望以后自己能亲自调试,去总结你这些问题的答案。废话不多说了,接下来回答问题。 1.所有的http请求,到达服务器上时,http.sys驱动最先负责处理这个请求,这个东西的最大并发数,如果可以设置,那这个设置选项的意思就是,你当前的服务器上的所有站点加一起,所能承担的最大并发数量。而你的设置,是在站点的属性中设置,所以你问的这个最大并发数,是站点的,而不是全局的。(此问题为个人推测) 2.http.sys是否是单线程,这个并不重要。但可以肯定的一点是,这个驱动在网络层处理http请求,性能是不用怀疑的,但我猜测其内部应该为多线程,但多线程也要有个数量,2个?3个?200个?300个?都可以叫做多线程,在windows下众多网络模型中,IOCP性能最高,我猜测这个驱动应该使用的是IOCP模型,这种模型下,并不需要很多个线程,顶多是cpu核心数目x2个工作者线程。这一部分如想深究,可以研究一下IOCP模型吧。另外,内核中,并不是线程数量越多,效率越高,通常驱动编程中,很少大批量创建线程。所以,目测这个驱动中的线程数为2--10个这个样子。具体的应该有工具可以看到,比如XueTr、PC Hunter之类的工具,也可以试试看。 3.第一,队列程序为保存当前没有被处理的http请求,待iis的进程池中有空闲的进程可以处理http请求时,会从这个队列里拿过一个请求进行处理,一般进程池大小也就是w3wp.exe进程的数量,由于w3wp.exe进程内是多线程处理,具体处理请求时,一个进程可以处理n个站点上来到的http请求,但这样很不合理,所以进程池大小通常不会设置为1。这个东西设置为多少,需要根据站点的访问情况酌情设置。 第二,w3wp.exe处理http请求时,只能处理静态内容的请求,比如访问一个txt或html文件,这个进程处理后,就可以把结果给http.sys,然后http.sys把数据发送给请求的浏览器,对于aspx等类型的动态内容,w3wp.exe进程从符号映射表(什么类型的文件,由哪个ISAPI扩展程序处理)中找到处理程序,把这次请求,让这个程序处理,这个程序处理完再传递给w3wp.exe,之后就是给http.sys然后发回客户端。如你问题中所说,asp.net_isapi.dll就是处理aspx类型文件的ISAPI扩展程序了。说到这里,其实可以大言不惭的说,我们可以自己创建一个ISAPI扩展,然后自己发明一种脚本语法,用自己的ISAPI扩展去解析这个脚本语法,这样,你也就创造了一种web服务器端脚本语言。 第三,ISAPI扩展,通常在iis服务启动后,第一次http请求到来时,加载ISAPI扩展,一定时间内,这个ISAPI扩展是不会被卸载的,但是如果很长时间没有任何http请求,iis主进程会释放掉ISAPI扩展的。(但设置了“缓存ISAPI扩展”的话,ISAPI扩展到iis服务停止前是不会被卸载的)所以,ISAPI扩展是不会被频繁加载和卸载的。而且http.sys中还有缓存机制,对于短时间内的多次同样的http请求,iis可能会用之前的请求处理结果直接回复给客户端浏览器,对于这一点,在我调试ISAPI的时候,深受其害啊。修改了扩展,但修改的部分没有实时生效,被迫重启iis。 4.这个资源回收!=程序语言垃圾回收,而是对进程池中进程资源的回收。在很多种情况下,比如一个http请求在被处理的时候,由于其所使用的ISAPI扩展程序出现bug或者死锁,iis主服务会再次启动一个w3wp.exe进程去处理后来的http请求,这样无限启动下去,直到启动到进程池大小数量个w3wp.exe个进程。如果此后再有请求,那么iis会给出一个很sorry的应答:“Service Unavailable”。到这里,我们应该知道那个回收资源是干什么的了,如果iis主进程发现有很多个w3wp.exe已经挂掉,不再具备处理请求的能力,而这个进程如果还继续存在的话,就会占用进程池中的名额,对于这种已经死掉的进程,iis会主动杀掉,已恢复进程池中,可用进程数量。 以上仅仅是个人观点,如有不同意见,欢迎大家批评指正。
mizuho_2006 2012-10-31
  • 打赏
  • 举报
回复
建议看一下邹华栋老师的视频,服务器如何响应客户端的请求,页面生命周期的过程,服务端如何生成客户端控件树,什么时候调用哪个类的什么方法,讲解都很详细。
net5354 2012-10-31
  • 打赏
  • 举报
回复
如果懂的话,都去开发操作系统了
zhaoyabin 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

1.在IIS7.0的网站管理里面,右键网站有个高级设置,里面有个最大并发数,这里的并发数指的是什么,因为所以的请求都会先经过http.sys处理,这里可不可以理解为http.sys在某一时刻所能承受的并发数?

应该是允许同时维持会话的个数,当一个客户端开启多个浏览器的时候,连接数甚至少于连接的客户端数量。

2.一个应用程序池中可以包含多个站点,当http.sys接收到客户端的……
[/Quote]

IIS的线程池有多大?是否可以调整,当第二次请求的时候 ,IIS会怎么做
XBodhi. 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

建议看一下邹华栋老师的视频,服务器如何响应客户端的请求,页面生命周期的过程,服务端如何生成客户端控件树,什么时候调用哪个类的什么方法,讲解都很详细。
[/Quote]

顶。
devmiao 2012-10-30
  • 打赏
  • 举报
回复
1.在IIS7.0的网站管理里面,右键网站有个高级设置,里面有个最大并发数,这里的并发数指的是什么,因为所以的请求都会先经过http.sys处理,这里可不可以理解为http.sys在某一时刻所能承受的并发数?

应该是允许同时维持会话的个数,当一个客户端开启多个浏览器的时候,连接数甚至少于连接的客户端数量。

2.一个应用程序池中可以包含多个站点,当http.sys接收到客户端的请求的时候,会选择对应的应用程序池,http.sys是否是单线程工作,如果是单线程工作,在网站访问量大的情况下是否会出现瓶颈问题?(因为我想http.sys也要做一些判断处理,性能肯定会有损耗)

不会,和线程没有关系。

3. http.sys会接收客户端的请求,会根据请求,选择对应的应用程序池,会将请求放在应用程序池的队列中去,默认的IIS7.0的队列长度是1000,这里的队列程序和前面提到的并发数之间是什么关系,应用程序池对应一个工作者进程,所有的处理都会在这里进行,会对不同的资源请求作出不同的相应,如果是asp.net,就会加载ISAPI,进而加载CLR,而CLR会创建APPDomain,然后开始处理请求,HttpRuntime>httpApplicationFactory>HttpAlication>,这是第一个请求做做的事情,我的问题是当第二个请求过来的时候,IIS会做哪些事情,w3wp是不是多线程运行的,如果是,线程池是多大,如何设置,怎么设置最合理,第二个asp.net请求过来的时候,会不会重复的去加载ISAPI,并行处理是怎么做的。

会使用线程池,一般自动管理就可以了。

4.IIS6.0应用程序池里面有个资源回收,这里的回收,是回收w3wp的资源吗,具体的要回收哪些资源,为什么要回收,在我看来w3wp就是一个请求线程池,来循环的接收请求。

一个应用程序池代表一个进程。

62,241

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧