从IIS定期重启服务开始

  • 起因

  手上的项目是.NET 做的,运行在Windows服务器的IIS上。消息推送的时候有利用WebSocket像客户端推送消息,由于IIS定时会重新服务回收资源,会导致WebScoket服务重启,期间一些消息会收到影响。暂时的解决方案可以使用定时计划在非高峰期回收资源(可以参考:https://www.cnblogs.com/Fishwood/p/3602041.html)

  前端突然问我:为什么IIS会回收资源?我查了下资料说是为了保持系统的稳定性,但还是不甚理解。

  • 原因

  晚上看nginx服务器的Web请求处理机制的时候突然得到了解答,摘抄如下:

  Web服务器和客户端是一对多的关系,Web服务器必须有能力同时为多个客户端提供服务。一般来说,完成并行处理请求工作有三种方式可供选择:多进程方式、多线程方式和异步方式。

  1.多进程方式

   多进程方式是指,服务器每当接收到一个客户端时,就由服务器主进程生成一个子进程出来和该客户端建立连接进行交互,直到连接断开,该子进程就结束了。

   多进程方式的优点在于,设计和实现相对简单,各个子进程之间相互独立,处理客户端请求的过程彼此不受干扰,并且当一个子进程出现问题时,不容易将影响扩散到其他进程中,保证了提供服务大的稳定性。当子进程退出的时候,其占用的资源就会被操作系统回收,也不会留下垃圾。而其缺点也是很明显的。操作系统中生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定的额额外开销,因此如果Web服务器接受大量并发请求,就会对系统资源造成压力,导致系统性能下降。

   初期的Apache服务器就是采用的这种方式对外提供服务的。为了应用大量的并发请求,Apache服务器采用了“预生成进程”的机制对多进程方式仅从了改进。“预生成进程”的工作方式是将生成子进程的时机提前,在请求还没到达前就预先生成哈,当请求到达时,主进程就分配一个子进程和该客户端进行交互,交互完成后,该进程也不结束,而是被主进程管理起来等待下一个客户端请求的到来。改进的多进程方式在一定成都上缓解了大量并发请求情形下Web服务器对系统资源造成的压力。但是由于Apache服务器在最初的架构上采用了多进程方式,因此这不能从根本上解决问题。 

  2.多线程方式

   多线程方式是指,服务器每当接收到一个客户端时,就由服务器主进程派生出一个线程出来和该客户端进行交互。

   由于操作系统产生一个线程的开销远小于产生一个进程的开销,所以多线程方式在很大程度上减轻了Web服务器对系统资源的要求。该方式使用线程进行任务调度,开发方面可以遵循一定的标准,这相对来说比较规范和有利于协作。但在线程管理方面,该方式哟一定的不足。多个线程位于同一个进程内,可以访问同样的内存空间,彼此之间相互影响;同时在开发的过程中不可避免的需要开发者自己对内存进行管理,其增加了出错的风险。服务器系统需要长时间连续不停地运转,错误的逐渐积累可能最终对整个服务器产生重大影响。

   IIS服务器使用了多线程方式对外提供服务,它的稳定性相对来说还是不错的,但是通常还是会定期检查和重启服务器,以预防不可预料的故障发生。

  3.异步方式

   首先从同步、异步以及阻塞、非阻塞的概念开始:

   网络通信中的同步机制和异步机制是描述通信模式的概念。同步机制,是指发送方发送请求后,需要等待接收到接收方返回的响应后,才接着发送下一个请求;异步机制,和同步机制相反,发送方发出一个请求后,不等待接收方响应这个请求,就继续发送下一个请求。在同步机制中,所有的请求都在服务器端得到同步,发送方和接收方对请求的处理步调是一直的;在异步机制中,所有来自发送方的请求形成一个队列,接收方处理完成后通知发送方/

   阻塞和非阻塞用了描述进程处理调用的方式,在网络通信中,主要指网络套接字Socket的阻塞和非阻塞方式,而Socket的实质也是IO操作。Socket的阻塞调用方式为,在结果返回之前,之前线程从运行状态被挂起,一直等到调用结果返回之后,才进入就绪状态,获取CPU后继续急性;Socket的非阻塞调用方式中,如果调用结果不能马上返回执行下一个调用。

   事实上同步和阻塞,异步和非阻塞这两对概念存在一定的区别,不能混淆。两队概念的组合,就会产生四个新的概念:同步阻塞,异步阻塞,同步非阻塞,异步非阻塞。

   1)同步阻塞方式,发送方向接收方发送请求后,一直等待响应;接收方处理请求时进行的IO操作如果不能马上得到结果,就一直等到返回结束后,才响应发送方,期间不能进行其他工作。这种方式实现简单,但是效率不高。

   2)同步非阻塞方式,发送方向向接收方发送请求后,不用等待响应;接收方处理请求时进行的IO操作如果不能马上得到结果,就立即返回,去做其他事情,但由于没有得到请求处理结果,不响应发送方,发送方一直等待。一直到IO操作完成后,接收方获得结果响应发送方后,接受方才进行下一请求过程。在实际中不实用这种方式。

   3)异步阻塞方式,发送方向接收方发起请求后,不用等待响应,可以接着进行其他工作;接收方处理请求时进行的IO操作,如果不能马上得到结果,就一直等到返回结果后,才响应发送方。这种方式在世实际中也不实用。

   4)异步非阻塞方式,发送方向接收方发送请求后,不用等待响应,可以继续其他工作,接收方处理请求时进行的IO操作如果不能马上得到结果,也不等待,而是马上返回去做其他事情。当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。在四种方式中,这种方式是发送方和接收方通行效率最高的一种。

   而Nginx采用的是机制是结合多进程机制和异步机制对外提供服务,采用异步非阻塞方式,可以同时处理大量并发请求。

原文地址:https://www.cnblogs.com/Run-dream/p/9508900.html

时间: 2024-10-16 11:42:14

从IIS定期重启服务开始的相关文章

WCF服务寄宿IIS与Windows服务

WCF是Windows平台下程序间通讯的应用程序框架.整合和 .net Remoting,WebService,Socket的机制,是用来开发windows平台上分布式开发的最佳选择.wcf程序的运行需要一个宿主ServiceHost,我们可以选用控制台应用程序,也可以选择IIS寄宿,还可以选择windows 服务寄宿.相较与控制台程序,IIS,和Windows服务比较稳定.而且大家不会时不时的去重启下IIS下的网站,或者windows服务. 在IIS下寄宿Wcf 我们新建一个类库项目 在项目下

IIS Admin Service 服务由于下列服务特定错误而终止: 无效签名。

于是查看系统日志: 具体信息如下:日志名称:          System来源:            Service Control Manager日期:            2015/11/29 16:53:06事件 ID:         7024任务类别:          无级别:            错误关键字:           经典用户:            暂缺计算机:           DESKTOP-MKK5408描述:IIS Admin Service 服务由

在CentOS 7中启动/停止/重启服务

RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Linux标准组的启动脚本. Systemd是一个Linux操作系统下的系统和服务管理器.它被设计成向后兼容SysV启动脚本,并提供了大量的特性,如开机时平行启动系统服务,按需启动守护进程,支持系统状态快照,或者基于依赖的服务控制逻辑. 先前的使用SysV初始化或Upstart的红帽企业版Linux版本

[老老实实学WCF] 第三篇 在IIS中寄存服务

原文:[老老实实学WCF] 第三篇 在IIS中寄存服务 老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我们对WCF的编程生命周期有了一个最基本的了解. 在前两篇中演示的例子,一定要力求背着做下来,包括源程序.配置文件都要背着一行行的手写下来,这样才能有深刻的体会.WCF的知识零散复杂,必须扎扎实实的学习和练习.如果你还没有做到了然于胸,现在赶紧翻

在IIS中寄存服务

http://blog.csdn.net/songyefei/article/details/7381595 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我们对WCF的编程生命周期有了一个最基本的了解. 在前两篇中演示的例子,一定要力求背着做下来,包括源程序.配置文件都要背着一行行的手写下来,这样才能有深刻的体会.WCF的知识零散复杂,必须扎扎实实的学习和练习.

架设证书服务器 及 让IIS启用HTTPS服务

无废话图文教程,教你一步一步搭建CA服务器,以及让IIS启用HTTPS服务. 一.架设证书服务器(CA服务) 1.在系统控制面板中,找到“添加/删除程序”,点击左侧的“添加/删除windows组件”,在列表中找到“证书服务”,安装之. 2.CA类型,这里有四种选择,这里以“独立根CA”为介绍. 3.CA识别信息,这里可以为你的CA服务器起个名字. 4.证书数据库设置,用于保存证书的相关数据库和日志文件,这个默认就行了. 5.安装完成后,在 控制面板 - 管理工具 中就可以打开 证书颁发机构,这个

老老实实学WCF[第三篇] 在IIS中寄宿服务

老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我们对WCF的编程生命周期有了一个最基本的了解. 在前两篇中演示的例子,一定要力求背着做下来,包括源程序.配置文件都要背着一行行的手写下来,这样才能有深刻的体会.WCF的知识零散复杂,必须扎扎实实的学习和练习.如果你还没有做到了然于胸,现在赶紧翻回去把例子再做一遍. 今天让我们稍微深入一点,了解一些关

IIS中访问自己开发的Webservice site就自动停止,尝试重启IIS和重启服务器都不能解决。

今天在加班的时候发现一个奇怪的问题,IIS里面我们自己开发的Webservice site一访问就自动停止.尝试重启IIS和重启服务器都不能解决.后台windows events报错信息是The Module DLL C:\Windows\System32\inetsrv\HipIISEngineStub.dll failed to load.  The data is the error. 后来找到了解决办法我也试了很好用. 1.用管理员身份打开C:\Windows\System32\inet

更改windows服务的配置文件(app.config)必须重启服务才能生效吗?

这个问题是前一阶段写windows服务碰到的.本来在写获取配置文件的某个配置的值的时候,通常我都是写类似下面的这么一个静态方法来获取: 1: /// <summary> 2: /// 获取每次处理记录数 3: /// </summary> 4: /// <returns></returns> 5: private static int GetRecordCount() 6: { 7: int recordCount = 10000; 8: try 9: {