失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识

构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识

时间:2022-01-01 05:33:34

相关推荐

构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识

正确而合理的配置IIS是构建一个高性能和高可扩展应用的基础。虽然很多的时候采用默认的配置就已经可以处理一般的情况,但是随着站点应用的发展,特别是当访问量稍微大一点的时候,就会暴露出很多我们认为的“奇奇怪怪”的问题。

所以,对IIS以及相关的配置有一个全面的理解是非常有必要的,不仅仅可以很好的帮助我们来搭建IIS宿主环境,而且还对我们应用代码的编写以更多的指导,而且也是性能优化中一个非常重要的组成部分。

我们首先会讲述IIS的一些知识和它的架构,这是理解后续内容的基础。

本篇的议题如下:

IIS与应用程序池

初窥IIS的内核

Http.sys解析

对于一台应用程序服务器而言,它的两个比较重要的功能就是:

1.监听从客户端发送来的Http请求;

2.调用请求处理程序从监听者那里获取请求,然后处理,并且把响应发送给监听者,然后由监听者发送回给客户端。

为了使得IIS 6的性能和可伸缩性最大,Microsoft将HTTP的监听者放在了操作系统的内核模式中,同时Microsoft也重写了请求处理程序,使得所有的应用程序有着更好的独立性,并且也加入了很多配置和特性,使得性能和稳定性有了大幅度的提升。

首先我们就来讲讲“内核模式”与“用户模式”的一些概念,因为后面的文章会大量的用到这些概念。

所谓的内核模式,就是Windows内部核心的操作,在内核模式中运行的进程有着很高的优先级,可以直接访问硬件以及系统底层的一些数据例如管理线程,进程,管理I/O设备的驱动等。

用户模式就是除了内核模式以外的操作,例如位来自用户应用程序的请求提供服务,包括IIS,SQL Server等。所有用户模式的应用程序通过运行在内核模式的执行层访问资源,例如,如果应用程序要进行磁盘的I/O,那么该请求就会提交到内核模式的执行层,由它来执行请求并且将结果返回给发出请求的用户模式的进程。

Http请求监听者(HTTP.sys)是运行在内核模式中的,所以允许它已经非常高的优先级运行,并且还可以直接的访问网络接口,这样极大的提升了性能,所以这样使得IIS对HTTP的请求的响度度也大大的提高。

下面,我们就开始进入今天的第一个议题。

IIS与应用程序池

从IIS6引入了应用程序池的概念,应用程序池使得每个Web程序都在一个独立的环境中运行。一个或者多个Web应用可以加入到一个应用程序池中,每一个应用程序池都在一个单独的进程中运行,这就意味着即使一个应用程序池崩溃了也不会影响其他的应用程序池。

出了独立性以外,应用程序池还允许我们进行更多的配置,例如,配置应用程序池运行中的进程运行是的标识(即,以何种身份进行运行),还可配置.NET Framework的版本,健康检查,以及与高性能高可用的一些设置。

对于不同的Web应用程序,其性能,稳定性等都是不一样的,所以正确的配置会对站点的影响非常大(其实很多的时候,我们采用了很多的默认的配置)。

在每一个应用程序池中接受至少有一个运行的进程来接受与处理请求,我们就将这个进程称之为“工作进程”。当一个发送到特性的URL请求被IIS接受之后,请求就会被转发给正确的应用程序池,然后被池中的工作进程处理。

一个应用程序池可以配置为运行多个工作进程,这个时候,我们就将这个情况称为“Web Garden”(中文的意思翻译出来就变味了)。当一个池被配置称为Web Garden的时候,请求就会被转发给其中的一个进程处理。

说了这么多,我们就来看看一些比较深一点点的话题。

初窥IIS的内核

正如之前我们所说的,为了使得IIS的性能最高,那个介绍HTTP请求的监听者运行在内核模式中。被接受到的请求被放在对应的应用程序池的队列中,之后被用户模式的工作进程处理。如果我们从这里来分析性能的话,大家其实可以分析出:处理一个的请求,其实需要涉及到三次的线程切换与二次的模式切换,所以请求的处理时间和代价是相当的高的,我们后面会讲述如何尽量的避免这样的情况。

为了使得大家更加的清楚,我们用一个图来说明一下:

上图显示了在IIS7中的请求的处理的一般流程,但是这IIS6的处理流程还是有点区别的。在IIS6中,WWW Service包含了Windows Process ActivationService (WAS)的功能。

朋友们可能担心上面的图看不懂,没关系,我们就来具体的看看。

Http.sys解析

我们这里的讲述就以上图做参照来说明。

当一个请求被HTTP监听者(HTTP.sys)接受之后,它根据请求的URL进行匹配,然后马上就把请求放在一个内核模式的不同的队列中,以便这些请求可以被用户模式中的应用程序池中工作进程获取,然后处理。这里之所以要把请求放在队列中是为了快速的释放HTTP监听线程,从而使得HTTP.sys可以接受其他更多的请求。另外,请求被放在不同的队列,主要是根据请求的URL来分组的,并且应用程序池中也配置了处理何种URL。

当响应产生之后,响应会被再次发送给HTTP.sys(大家可以看到图中第5个步骤),然后再把响应发送给客户端。HTTP.sys可以基于一些配置将响应进行缓存,我们会在后面进一步的讨论。

这里有一点非常中的就是:HTTP.sys将响应缓存在内核中,并且这个内核中的这个缓存空间是不分页的。

什么是不分页的呢?

不分页就意味着HTTP.sys总是将响应的内容缓存物理的内存中,而且这一块内存不会被交换出去,就是说不会被分页到磁盘上面(这部分的内容已经涉及到了Windows的内存管理知识)。

当请求的响应被缓存在了内核模式之后,下次再次请求的时候,可以直接的读取缓存,而后续的步骤全部跳过,这会极大的提升性能。

今天我们谈到这里,下一篇接着谈!

作者介绍:汪洋,哪合伙CEO,曾大汉电子商务有限公司首席技术官,副总裁,负责公司产品、技术、运营,参与商业模式设计。华康移动医疗前CTO,副总裁,首席架构师。微软MVP

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

赞赏

人赞赏

如果觉得《构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。