正确而合理的配置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请求的监听者运行在内核模式中。被接受到的请求被放在对应的应用程序池的队列中,之后被用户模式的工作进程处理。如果我们从这里来分析性能的话,大家其实可以分析出:处理一个ASP.NET的请求,其实需要涉及到三次的线程切换与二次的模式切换,所以请求的处理时间和代价是相当的高的,我们后面会讲述如何尽量的避免这样的情况。

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

上图显示了在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必须掌握的知识相关推荐

  1. 构建高性能.NET应用之配置高可用IIS服务器-第四篇 IIS常见问题之:工作进程回收机制(上)

    通过三篇文章的普及,相信大家对IIS应该有了一个基本的了解.那么从本篇文章开始,我们就开始进入IIS一些比较实际的话题:如何配置IIS,使得其性能尽可能的高. 我们在本篇中主要讲述的就是"工 ...

  2. 构建高性能.NET应用之配置高可用IIS服务器-第三篇 IIS中三个核心组件的讲解(上)

    今天的文章的比较的容易,主要讲述IIS中三个比较重要的组件:协议监听者(Protocol Listeners),WWW服务(World Wide Web Publishing Service)和WAS ...

  3. 构建高性能.NET应用之配置高可用IIS服务器-第二篇 IIS请求处理模型

    在IIS 中,Http监听者(http.sys)和请求处理者由两个系统服务在控制着.一个是WWW 服务,另外一个就是Windows Process Activation. 对于WWW服务,它主要是监控 ...

  4. 构建高性能.NET应用之配置高可用IIS服务器-第五篇 IIS常见问题之:工作进程回收机制(中)...

    我们在本篇中接着讲述"工作进程回收机制". 本篇文章的议题如下:                工作进程回收机制讲解 基于时间的回收机制                基于请求数的 ...

  5. 构建高性能.NET应用之配高可用IIS服务器-第五篇 IIS常见问题之:工作进程回收机制(中)

    我们在本篇中接着讲述"工作进程回收机制". 本篇文章的议题如下:          工作进程回收机制讲解 基于时间的回收机制          基于请求数的回收机制         ...

  6. 服务器集群之keepalived配置高可用(资料)

    2019独角兽企业重金招聘Python工程师标准>>> Linux集群概述 • 根据功能划分为两大类:高可用和负载均衡 • 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当 ...

  7. 《构建高可用Linux服务器》互动网首发

    书名:构建高可用Linux服务器 ISBN:9787111359423 作者:余洪春 定价:79.00元 出版时间:2011年10月 出版社:机械工业出版社 订书页面 编辑推荐: 基于实际生产环境,从 ...

  8. 《构建高可用Linux服务器 第3版》—— 1.4 Linux服务器的日志管理

    本节书摘来自华章出版社<构建高可用Linux服务器 第3版>一 书中的第1章,第1.4节,作者:余洪春 ,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.4 ...

  9. 《构建高可用Linux服务器》第一版勘误表(附脚本下载)

    <构建高可用Linux服务器>因为印刷或自己检查不仔细的原因还是有许多错误的,这个在第二次印刷时会统一改正(脚本下载地址为 http://www.hzbook.com/Books/6021 ...

最新文章

  1. Transformer新玩法登Nature子刊
  2. 一文详解 API 设计最佳实践
  3. LeetCode 11. Container With Most Water--Java 解法--困雨水简单版
  4. JVM并行收集器ParNew、Parallel相关参数
  5. HashSet集合存储数据的结构(哈希表)及set集合存储元素不重复的原理
  6. 超简单的利用plist 查看ipa包名及其它信息
  7. 前端学习(607):javascript导读
  8. Redis性能问题排查解决手册(七)
  9. 上架服务器必须做的准备工作
  10. IE无法打开新链接的问题
  11. 教你用报表工具搭建企业考核系统
  12. [转]关于C#操作WPS和office兼容性的问题
  13. 无需U盘最简单的系统重装Win10
  14. 解放双手, python自动化操作电脑端微信
  15. photoshop中如何给图片加水印和去水印
  16. 【牛腩新闻发布系统之handler】
  17. テーブルTVARVとTVARVCについて
  18. 安卓结构能转换成苹果借口吗_别错过!这可能是苹果近几年最精彩的发布会了...
  19. 太原科技大学计算机宿舍,太原科技大学宿舍条件怎么样,有独立卫生间和空调吗...
  20. 中南大学杰出校友_杰出客户服务的10个要点。

热门文章

  1. MDT部署中命令行脚本的使用。
  2. JavaScript对SEO的影响及解决之道
  3. C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法
  4. Task.Factory.StartNewTResult 和 Task.RunTResult 到底有什么区别?
  5. 基于ASP.NET Core SignalR的流式传输
  6. 磨刀不误砍柴工—Exceptionless搭配log4net记录日志
  7. 【分享】154页微软WPF官方手册(含.NETCore和.NET Framwork双版本)
  8. ASP.NET Core中间件初始化探究
  9. 小团队前端部署演化之路
  10. 如何基于 DDD 构建微服务?