IIS回收基本等价于重启站点,因此所有线程都会被回收掉。至于没有再生成的原因,我估计是你把代码写在Global.asax的Application_Start里了,但是Application并不是说你启动了站点就算是Start了,而是要有第一个请求过来,才会真的Start(这个时候才会生成native code)。这个很好理解,比如你刚部署了一个web application,你启动站点,别去访问它。一天后你再访问,第一次还是非常慢(因为服务器上在生成native code),这个时候Application_Start才真正被执行了。
嗯,对,这个能想通!
那你能给我一个解决方法吗?
还有就是我一直想不通一个问题就是asp.net web应用程序到底是多线程还是单线程呢,比如,当前的站点中存在一个页面,这个页面就是去访问这个站点中的一个唯一的资源,在这种情况下,如果有两个访客,同时去访问这个页面,这个页面就会去访问空上唯一资源,当前IIS会如果处理呢?我看过MSDN但是,还是不是很清楚得!
@challengesoflife: 你的每个web application都会被IIS分配一个线程去执行,然后你可以在你自己的程序里再去开多个线程,这跟IIS是没什么关系的。如果有两个访客同时去访问一个页面,那么他们是不同的线程。你在页面里去访问唯一的资源,就要考虑到线程安全性。比如你在这个页面里去写同一个文件,理论上就有可能有一次是写入失败的。
@challengesoflife: 至于解决方案(也就是如何做到在web站点重启/回收后,就立刻执行application_start,我暂时也没有太好的想法。一个可行的做法就是另外写一个程序(或者windows service),定时去访问这个页面,然后再服务器上定时运行这个程序。
@水牛刀刀: 呵呵,谢谢你啊,解决方案,今天上午我想到了一个,搞定了!
你上面说的 web application 是指什么呢,能具体点吗?因为我理解的话,我就会理解成为一个web 站点去了;
然而,如果如你所说,那么,asp.net 的web应用程序就应是一个多线程的程序了?
@challengesoflife: 你可以理解为一个web站点,是的,它是一个多线程的程序。
@水牛刀刀: 那如你所说的,如果一个web站点是一个多线程的程序,那么,假设当前有一个WEB点,当前有1000个人同时来访问这个站点中的一个页面,那这个站点就产生了1000个线程,IIS能承受吗?如果能承受1000个线程,那更多的话,它还能承受吗?
@challengesoflife: IIS会处理好这种场景的。IIS有多个Queue,你可以想象是请求的队列。如果同时来了1000个,假设IIS的最大并发设置的是60个,那么就会先处理60个,后面的就进入等待队列。一旦请求处理结束,线程池有空闲,就会分配给等待队列里的请求。事实上就算有1000人在用你的系统,并发访问量也不会超过10,我现在所在的项目有几十万注册用户,有几台服务器做负载均衡,并发量都不超过50.你可以在服务器的运行命令里输入perfmon命令来查看IIS的运行情况(包括我刚说的队列情况都可以看到)。
@水牛刀刀: 嗯,说得通,晚上我回去看看,能不能做一个示例程序,来证明一下!
我还有疑问的是,如果当前是50万用户来请求,IIS最大并发量是1000,那排在后面的就会出现访问超时了,那假如排在第40万个用户就开始超时(也就是说40万-50万之间的访问是超时),此时IIS作何处理呢,它又如何处理呢?
@challengesoflife: IIS最大并发量没那么高的,也就50多吧。50万用户不可能同时请求服务器的,哪怕相差1秒,服务器也有足够的时间处理掉之前的请求了。如果真的同时有过多的用户同时请求,那么在用户看来就是非常非常慢,运气好的能打开,运气不好的站点就打不开了。如果长时间这样的话,站点就一直处于拥挤状态,正常用户无法访问,这也是DDOS的原理,此时IIS并不会做任何智能化的处理。要杜绝这种情况可以在IIS里做IP限制,或者用专业的防火墙来对付。
@水牛刀刀: 嗯,可以,呵呵,之前看MSDN的页面生成周期,看了两遍,没有怎么看懂,后来就没有时间看了。近来做点东西,又正好用到,心里一直难受着,现在算是明白很多了。呵呵
水牛刀刀 非常感谢啊
@challengesoflife: 不客气。MSDN还是很有用的,哪怕是英文也得忍着去看。
IIS回收会导致web app重启。线程当然会dead了。至于为什么没有再respawn,你自己找下原因吧!
根据IIS帮助文档对应用程序池回收方式的描述如下:
工作进程回收如何工作
根据应用程序池回收的配置方式,万维网发布服务(WWW 服务)可以使用两种方法来回收已分配的工作进程:
1. 默认情况下,WWW 服务建立“重叠回收”,即继续运行要终止的工作进程,直到启动新的工作进程后为止。
2. 或者,WWW 服务可以终止一个工作进程,然后启动一个新的工作进程(如果工作负荷允许执行此操作的话)。
我没有设置回收方式,当前就应是默认方式, 在默认方式下,它应先给我建一个新线程啊,但是怎么就没有呢?