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

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

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

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

        本篇的议题如下:

        IIS 与应用程序池

        初窥IIS的内核

        Http.sys解析

       

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

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

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

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

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

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

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

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

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

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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.NIO选择器(基于NIO的服务器与客户端通讯)

【README】 本文总结自B站《尚硅谷netty》,很不错; 【1】选择器Selector(多路复用器) 【1.1】基本介绍 1)Java 的 NIO,用非阻塞的 IO 方式。可以用一个线程,处理多个客户端连接,就…

perplexity 衡量指标_求通俗解释NLP里的perplexity是什么?

高赞回答讲得已经非常通俗易懂,不过由于自然语言处理的发展,出现了许多不同类型的模型,对困惑度这个指标的计算方法颇有不同(包括前面的高赞回答也只是展开了一个子集),常常让人摸不着头脑。所以这个回答旨在尽量全面地梳理不同语…

C#在Linux上的开发指南

本人才疏学浅,在此记录自己用C#在Linux上开发的一点经验,写下这篇指南。(给想要在Linux上开发C#程序的朋友提供建议) 目前在Linux上跑的网站:http://douxiubar.com | http://douxiubar.com/AdminLogin/Index&#xff0…

Oracle入门(十四E)之条件表达式case和deocde函数

一、表达式(1)条件表达式 共有两种条件表达式,即 CASE 表达式和DECODE 表达式。就 CASE 比较两个表达式而言,该表达式在逻辑上等效于之前学习的NULLIF 函数。如果两个表达式相等,则返回null,如果不相等&…

4.基于NIO的群聊系统

【README】 1.本文总结自B站《netty-尚硅谷》,很不错; 2.文末有错误及解决方法; 【1】群聊需求 1)编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非 阻塞) 2)实…

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

在IIS 中,Http监听者(http.sys)和请求处理者由两个系统服务在控制着。一个是WWW 服务,另外一个就是Windows Process Activation。 对于WWW服务,它主要是监控IIS的配置文件,将新的配置信息用到HTTP.sys和WAS上。同时它也维持一些性…

Oracle入门(十四F)之PL/SQL定义变量

一、变量介绍 (1)变量的使用可以使用变量: 临时存储数据存储值的操作可重用性(2)PL/SQL中的变量处理变量是: 在声明部分中声明和初始化在可执行部分中使用和分配新值变量可以是:作为…

小米手环nfc门卡摸拟成功后不能开门_如何使用小米手环5 NFC版进行门卡模拟(如公司门禁卡、小区门禁卡、学校门禁卡等)?...

由于本人最近购入了小米手环5 NFC版,所以对小米手环模拟门禁卡比较清楚一点。说一下用该手环模拟门禁的方法吧,我本人模拟的是学校公寓的门禁卡,不过学校的门禁卡是加密卡,可能操作起来稍微比不加密的门禁卡麻烦一点,因…

5.NIO零拷贝与传统IO的文件传输性能比较

【README】 1.本文总结自B站《netty-尚硅谷》,很不错; 2.本文部分内容参考自 NIO效率高的原理之零拷贝与直接内存映射 - 腾讯云开发者社区-腾讯云 【1】零拷贝原理 【1.1】传统IO的文件拷贝 【图解】 step1)调用 sys_read系统调用&#…

二进制漏洞利用与挖掘_二进制各种漏洞原理实战分析总结

本部分将对常见的二进制漏洞做系统分析,方便在漏洞挖掘过程中定位识别是什么类型漏洞,工欲善其事,必先利其器。0x01栈溢出漏洞原理栈溢出漏洞属于缓冲区漏洞的一种,实例如下:编译后使用windbg运行直接运行到了地址0x41…

Oracle入门(十四H)之良好的编程实践

一、为什么要学习它 好的编程实践是技巧,可以按照创建最好的代码可能。 编程实践涵盖了一切从代码更多可以用更快的速度创建代码性能。 软件工程团队通常会遵循风格指导让团队中的每个人使用相同的技术。 这使它更容易阅读和修改编写的代码其他。二、编程实践已经学…

微软.NET 正式劈腿成功,横跨所有平台

.NET官方博客宣布了《Announcing .NET Core RC2 and .NET Core SDK Preview 1》,正式如期发布了.NET Core RC2, 现在可以放心的基于.NET Core 构建 ASP.NET Core, console apps 和 class libraries for Windows, OS X and Linux。这里贴张图表达下他们之间的关系: …

2.BIO与NIO区别

【README】 1.本文总结自B站《netty-尚硅谷》,很不错;2.本文介绍 BIO, NIO的知识;【1】BIO(传统java IO模型) 1)BIO-Blocking IO:同步阻塞,服务器实现模式为一个连接一…

k8s往secret里导入证书_K8S之Secret

简介secret顾名思义,用于存储一些敏感的需要加密的数据。这些数据可能是要保存在pod的定义文件或者docker的镜像中。把这些数据通过加密的方式存放到secrets对象中,可以降低信息泄露的风险。在secret中存储的数据都需要通过base64进行转换加密后存放。创…

Oracle入门(十四G)之PL / SQL中检索数据

一、PL / SQL中检索数据 (1)PL / SQL中的SQL语句可以在PL / SQL中使用以下几种SQL语句:•SELECT从数据库检索数据。•DML语句,例如INSERT,UPDATE和DELETE,以更改数据库中的行。•事务控制语句,例…

.NET Core 1.0 CentOS7 尝试

昨天宣布 ASP.NET Core RC2,据说差不多稳定了,以后不会有大改了。 参考:https://blogs.msdn.microsoft.com/webdev/2016/05/16/announcing-asp-net-core-rc2/ 一、环境装备 等待很久了,高兴之余昨晚安装一个CentOS系统,版本如下&a…

6.netty线程模型-Reactor

【README】 1..本文部分内容翻译自: [Netty] Nettys thread model and simple usage 2.netty模型是以 Reactor模式为基础的,具体的,netty使用的是 主从Reactor多线程模型; 3.先介绍了 Reactor线程模型;后介绍了 Ne…

python mac读取 文件属性_从Python获取和设置mac文件和文件夹查找器标签

macfile模块是^{}模块的一部分,在"2006-11-20 0.2.0"中被重命名为mactypes使用此模块,以下两个函数可用于获取和设置appscript 1.0版的查找器标签:from appscript import appfrom mactypes import File as MacFile# Note these lab…

Oracle入门(十四.1)之PL / SQL简介

一、PL / SQL描述程序语言扩展到SQL: •允许将基本程序逻辑和控制流与SQL语句组合在一起。 •是Oracle专有编程语言。- 它只能用于Oracle数据库或工具。二、程序语言扩展到SQL•是一种程序语言。 - 当遵循一系列指令时会产生结果。 •是3GL(第三代编程语…

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

今天的文章的比较的容易,主要讲述IIS中三个比较重要的组件:协议监听者(Protocol Listeners),WWW服务(World Wide Web Publishing Service)和WAS(Windows Process Activation Service),理解这三个组件的功能,是理解IIS…