通常把站点发布到IIS上运行正常后,很少会去考虑IIS提供的各种参数,如何配置才是最适合当前站点运行需要的?这篇文章,从基本设置、回收机制、性能、并发、安全性等IIS设置讲解应当如何优化。

先来“IIS应用程序池”优化后的参数配置截图:

图中一些数值限制参数,可以借助一些工具(如:windows性能监控)观察站点运行的指标进行设置,具体后面会介绍到

下面来分别解说下这些参数为什么要这样设置(注:文章中的参数,不是按照应用程序池的设置从上到下排列的,而是按照优化的功能点排列)

一、设置应用程序池默认设置

按如下图进行默认参数模板设置,设置后,新建的应用程序池就使用这个默认参数模板。

二、常规设置

IIS版本号查看

在iis管理器中->帮助->关于Internet信息服务,如下图,版本是IIS10.

常规 > 启动32位应用程序

默认值:False

优化设置:按需设置。如果确认站点依赖一些32位的组件,需将此设置为true。

建议:为 32bit 应用程序的网站单独创建一个应用程序池

参考:64位系统上iis运行32位的网站程序

常规 > 托管管道模式

IIS7 应用程序池新增的经典模式和集成模式

经典模式:是为了保留和IIS6一样的处理方式,以前开发的代码,可以方便的移植到IIS7上。

集成模式:将ASP.NET请求管道与IIS核心管道组合在一起,这种模式与操作系统结合更紧密,能够提供更好的性能,能够实现配置和治理的模块化,而且增加了使用托管代码模块扩展IIS时的灵活性。

优化设置: 改为 Integrated(集成模式)

参考:对IIS7经典模式和集成模式的理解

三、 优化回收策略

回收 > 固定时间间隔(分钟)

一个时间段,超过该时间段,应用程序池将回收。值为 0 ,则应用程序池不会按固定间隔回收

默认值:1740分钟,29小时

优化设置:改为0 。因为无法避免在高峰期发生回收。同时设置“回收 > 特定时间”

回收 > 特定时间

应用程序池进行回收的一组特定的本地时间(24小时制)

优化设置:固定在低峰期时回收。eg:设定为 04:00 、15:30 等

另外,也可以使用windows计划任务实现iis站点每周六晚定时回收

进程模型 > 闲置超时(分钟)

一个时间段,设定工作进程允许保持闲置状态的最大时间间隔,超过该时间就会自动关闭。

优化设置:改为0,避免内存信息频繁被回收清空。同时设置“回收 > 特定时间”

进程模型 > 空闲超时操作

默认是“Terminate”(另一个选项是“Suspend”)。

Terminate 表示一旦超时就终止服务,并回收工作进程的缓冲区的内存;

Suspend 则悬停等待,暂不回收缓冲区内存。

另外:

CPU超限占用安全方案设置

CPU限制并不是用于控制每个进程的CPU利用率,而是一种处理发生CPU超限的工作进程的安全方案,这样可以避免工作进程占用CPU过久。

参考:iis7.0 cpu 限制

iis中对cpu限制的操作:

1.限制:10000 (以百分比*1000计算,10000则表示10%)

2.限制操作:1、noaction 无操作 2、KillW3wp 删除进程 并在限制时间内重新开启新进程

3.限制间隔(分钟):设置时间限制,多久时间内重启和检测

内存超限回收机制

根据实际运行情况设定 "回收 > 虚拟内存限制" 和 "回收 > 专用内存限制",默认为禁用状态,一般不用为此专门设定。

开启|关闭时间限制

根据实际运行情况设定,默认90秒。如上图,我都设置为了120秒

进程模型 > 关闭时间限制(秒):为工作进程指定的,完成处理请求并关闭的时间段。如果工作进程超过关闭时间限制,将被终止。

进程模型 > 启动时间限制(秒):为工作进程指定的,启动并进行初始化的时间段。如果工作进程初始化时间超过启动时间限制,将被终止。

回收 > 禁用重叠回收

默认值 false。应用程序池使用重叠回收方式。在这种方式下,当应用程序池要关闭某个工作进程时,会先创建一个工作进程,直到新的工作进程成功创建后才关闭旧的工作进程;

设置为 true,则先关闭旧的工作进程,然后再创建新的工作进程。 如果Web 应用程序不支持多实例运行,那么你必须配置应用程序池禁止使用重叠回收方式。

回收 > 生成回收事件条目

IIS事件查看器

方法一:点击“开始→运行”,输入eventvwr,点击“确定”,就可以打开事件查看器。

方法二:单击“开始”-“设置”-“控制面板”-“管理工具”-“事件查看器”,开事件查看器窗口。

方法三:在“运行”对话框中手工键入“%SystemRoot%/system32/eventvwr.msc /s”打开事件查看器窗口。

四、性能

关闭IIS日志

当开启记录功能后,IIS会事无巨细地忠实记录所有的web访问记录。这些记录文件的内容是非常庞杂的,比如访问时间、客户端IP、从哪个链接访问、 Cookies等,另外还包括 Method(方法), UserAgent(用户代理)等。这些记录不但占用大量的磁盘空间还大大地影响了web服务器的性能。有人做过评测,停止访问记录可以提升5%到8%的web性能。

启用内容过期(客户端缓存)

对于静态文件启用内容过期可以提高访问性能。

1、首先网站的目录要划分合理,图片、CSS、JavaScript均放在单独目录下

2、然后在IIS中选择要缓存的目录 > HTTP 响应标头 > 设置常用标头 > 设置"web内容过期"策略

如上图webDemo站点,这样,用户浏览器将比较当前日期和截止日期,以便决定是显示缓存页还是从服务器请求更新的页,由于图片、CSS、JS通常变化较少,因此基本上都从本地缓存读取,从而加快显示速度。

参考:IIS7禁用单个静态文件的客户端缓存

服务器验证缓存

IIS自动机制,会在访问css、js等静态文件时,返回给浏览器Last-Modified和Etag标记

参考:

浏览器缓存之Last-Modified

服务端的缓存验证 Last-Modified和Etag

启用Gzip压缩

IIS 压缩功能使用Gzip算法

gzip是HTTP的一种压缩算法,HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法。HTTP压缩采用通用的压缩算法如gzip等压缩HTML、JavaScript或 CSS文件。压缩的最大好处就是降低了网络传输的数据量,从而提高客户端浏览器的访问速度。当然,同时也会增加一点点服务器的负担。Gzip是比较常见的一种HTTP压缩算法。

五、IIS初始化(预加载),解决(被回收后)第一次访问慢

参考:https://www.cnblogs.com/teamblog/p/6195078.html

设置之后,什么时候会自动初始化?

(比如初始化执行 Global.Application_Start 初始化函数)

1)会 - 应用程序池启动、应用程序池回收、cmd->iisreset (w3wp的PID会变)

2)不会 - 站点重启(IIS站点右键 > 管理网站 > 重新启动)、站点启动

3)不会 - web.config更改引起的应用程序池回收

在IIS10版本上测试是上面行为。另外有人IIS8.5上使用也是同样的行为,参考文章。

步骤一、安装IIS应用程序初始化功能

步骤二、设置IIS上应用程序池启动模式

常规 > 启动模式

默认值:OnDemand(按需运行模式),另外值AlwaysRuning(始终运行模式)

优化设置:改为 AlwaysRunning(始终运行)

步骤三、设置站点预加载

在IIS上站点右键 > 管理网站 > 高级设置,把【预加载已启用】设置为true。

步骤四、配置站点 web.config ,添加站点重启后预加载请求的页面

地址:http://webdemo.com/home/about

这样操作保存后,IIS会修改 web.config 添加如下内容


<system.webServer>
……
<applicationInitialization doAppInitAfterRestart="true">
<add initializationPage="home/about" hostName="" />
</applicationInitialization>
</system.webServer>

如果只是初始化(比如只执行 Global.Application_Start 初始化函数),不需要访问特定API进行额外资源的初始化,则不需要 <add initializationPage="**" /> 子节点

六、并发性

常规 > 队列长度

HTTP.sys 将针对应用程序池排队的最大请求数。默认值1000,最大值65535。

如果设置太大则会消耗大量的系统资源 ,而设置太小会导致客户端访问时频繁出现"503服务不可用"响应。

优化设置:可先改为 5000(设置为预期最多并发用户数的1.5倍,官方参考:https://docs.microsoft.com/zh-cn/previous-versions/office/communications-server/dd441171(v=office.13)

使用windows性能监控(性能监控:cmd->perfmon.msc),添加“HTTP Service Request Queues/CurrentQueueSize”指标,观察某个应用程序池当前队列中请求的个数。

启用Web园(Web Garden),进程模型 > 最大工作进程数

在Web园中你可以配置此应用程序池所使用的最大工作进程数,默认为1,最大可以设置为4000000; 配置使用多个工作进程可以提高该应用程序池处理请求的性能,但是在设置为使用多个工作进程之前,请考虑以下两点:

1、每一个工作进程都会消耗系统资源和CPU占用率;太多的工作进程会导致系统资源和CPU利用率的急剧消耗;

2、每一个工作进程都具有自己的状态数据,如果Web应用程序依赖于工作进程保存状态数据,那么可能不支持使用多个工作进程。

这样设置,增加了处理进程数,相当于集群,避免大量请求处于排队状态

参考:IIS并发优化 (https://www.jianshu.com/p/5de10f1a994e)

文章介绍:使用windows性能监控:cmd->perfmon.msc。监控IIS应用运行情况,再根据需要进行iis参数设置

Web Service/Current Connections 监控某个应用程序池来指示当前该应用程序池的连接的数量。

ASP.NET Apps v4.0.30319/Requests Executing 监控所有的 ASP.Net 4.0 正在处理中的请求数量。

ASP.NET v4.0.30319/Requests Current 与上述类似用于监控 Asp.Net 4.0 正在处理中的请求数量。

HTTP Service Request Queues/CurrentQueueSize 用来监控某个应用程序池当前队列中请求的个数。

调整支持并发请求的数量

默认支持并发请求数量为:5000

超出此并发数,会报异常

HTTP Error 503.2 - Service Unavailable

The serverRuntime@appConcurrentRequestLimit setting is being exceeded.

参考:IIS 并发请求设置如何设置?

站点最大并发连接数

右键站点 > 高级设置 > 限制 > 最大并发连接数

设置站点线程数:minWorkerThreads、maxWorkerThreads、maxIoThreads

(感谢园友 @ runliuv 提供的新姿势)

minWorkerThreads默认1,maxWorkerThreads默认20,maxIoThreads默认20

1、配置文件:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config

2、修改参数: <processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" />

其中:minWorkerThreads = maxWorkerThreads / 2

参数具体值如何设置,还需要各自对站点进行压力测试中调整

参考:

IIS7.5优化--提高线程数来适应高并发https://www.cnblogs.com/lpyicq/p/7852298.html

processModel 元素(ASP.NET 设置架构)

Improving ASP.NET Performance    (微软文档中给出了推荐值,如下图)

七、安全性

为不同工作进程指定应用程序池(工作进程隔离模式)

一台服务器上有非常多的Web站点。如何才能做到各个站点之间相互独立,不因某些Web站点出现故障而影响其他站点呢?--为不同工作进程指定应用程序池是个很好的解决办法。

进程模型 > 标识,使用ApplicationPoolIdentity虚拟账户

ApplicationPoolIdentity – 默认情况下,选择“应用程序池标识”帐户。启动应用程序池时动态创建“应用程序池标识”帐户,因此,此帐户对于您的应用程序来说是最安全的。(这样,每个应用程序池都有各自的账户,就避免了木马上传到其中一个池下站点,会对另一个池的文件夹有操作权限)

参考:IIS7.5中神秘的ApplicationPoolIdentity

启用快速失败保护

如果Web应用程序代码编写有问题,它可能会导致工作进程持续出现问题。默认情况下应用程序池配置为启用快速失败保护,当工作进程在配置的时间段(默认为5分钟)内发生的失败次数超过了配置的值(默认为5次),则禁用此应用程序池。

IIS基本设置、回收机制、性能、并发、安全性的更多相关文章

  1. 【转载】Java性能优化之JVM GC(垃圾回收机制)

    文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ...

  2. Java性能优化之JVM GC(垃圾回收机制)

    Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ...

  3. Android性能调优篇之探索垃圾回收机制

    开篇废话 如果我们想要进行内存优化的工作,还是需要了解一下,但这一块的知识属于纯理论的,有可能看起来会有点枯燥,我尽量把这一篇的内容按照一定的逻辑来走一遍.首先,我们为什么要学习垃圾回收的机制,我大概 ...

  4. JVM性能优化--Java的垃圾回收机制

    一.Java内存结构 1.Java堆(Java Heap) java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例 ...

  5. .NET垃圾回收机制(二)

    一.GC的必要性 1.应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存. 2.应用程序对资源(内存使用)管理的方式,常见的一 ...

  6. 垃圾回收机制GC知识再总结兼谈如何用好GC

    一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...

  7. .NET垃圾回收机制 转

    在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR( ...

  8. 垃圾回收机制GC知识再总结兼谈如何用好GC(转)

    作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...

  9. 回收机制GC

    .NET 之 垃圾回收机制GC 一.GC的必要性 1.应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存. 2.应用程序对资源 ...

随机推荐

  1. jackson 学习资料

    源代码托管地址 https://github.com/FasterXML/jackson https://github.com/FasterXML/jackson-docs http://www.st ...

  2. JavaSE01:初始Java

    java语言的优势 简单性 面向对象 跨平台性(可移植性) 高性能 分布式 动态性 多线程 安全性 健壮性 java最大的特点是跨平台性 Java的跨平台性来源于Java虚拟机(jvm),Java靠在 ...

  3. Cheat Engine 修改汇编指令

    打开游戏 扫描阳光 扫描过程就不讲了 找到阳光的地址 显示反汇编 找到使阳光减少的反汇编代码 空指令替换 将阳光减少汇编指令,用空指令替换.这样阳光就不再减少了 指令替换 也可以将汇编指令修改,减少变 ...

  4. OCR5:预处理

    Tesseract4.X已经有了初步成效(见下面的对比), 但目前结果对于训练之外的数据, 仍会有很大的偏差.想要更好的 OCR 结果, README 中重点强调的一点是: 在交给 Tesseract ...

  5. 【Python】进程、线程、协程对比

    请仔细理解如下的通俗描述 有一个老板想要开个工厂进行生产某件商品(例如剪子) 他需要画一些财力物力制作一条生产线,这个生产线上有很多的器件以及材料这些所有的为了能够生产剪子而准备的资源称之为:进程 只 ...

  6. vue脚手架引入MD5加密函数

    可以在全局定义一个MD5的方法,然后引入到vue的脚手架中. 首先 npm install crypto --save 然后引用定义一个对象, import crypto from 'crypto'; ...

  7. MySQL--performance schema学习

    启用performance schema 在MySQL 5.6.6版本后,performance schema被默认打开 通常MySQL的二进制版本都默认支持PS, 如果使用编译源码安装,在cmake ...

  8. python __getattr__ & __getattribute__ 学习

    实例属性的获取和拦截, 仅对实例属性(instance, variable)有效, 非类属性 getattr: 适用于未定义的属性, 即该属性在实例中以及对应的类的基类以及祖先类中都不存在 1. 动态 ...

  9. Example-based Machine Learning是什么?

    参考:https://christophm.github.io/interpretable-ml-book/proto.html EML简介 Example-based Machine Learnin ...

  10. Linux—— 报错汇总

    前言 记录Linux相关的错误问题和解决方法 问题 tar: Error is not recoverable: exiting now [报错] tar -zxvf mysql-server_5.6 ...