首页 新闻 会员 周边 捐助

asp.net IIS 回收与线程死亡

0
悬赏园豆:50 [已解决问题] 解决于 2011-11-01 17:26

近来做了一个WEB项目,大概流程就是,应用程序一启动的时候WEB项目就新建一个线程,在这个线程里是一个死循环,每5秒就去访问某些页面,因为有死循环,所以就设置了IIS的回收,我设置的是每2小进回收一次,但是,根据LOG记录来看,每次回收后,线程就死亡了,而且也没有再生成了。

 

现在我就想请教的是,IIS回收的时候为什么线程会死亡,而且,死亡了也没有再生成呢?

challengesoflife的主页 challengesoflife | 初学一级 | 园豆:43
提问于:2011-11-01 09:40
< >
分享
最佳答案
0

IIS回收基本等价于重启站点,因此所有线程都会被回收掉。至于没有再生成的原因,我估计是你把代码写在Global.asax的Application_Start里了,但是Application并不是说你启动了站点就算是Start了,而是要有第一个请求过来,才会真的Start(这个时候才会生成native code)。这个很好理解,比如你刚部署了一个web application,你启动站点,别去访问它。一天后你再访问,第一次还是非常慢(因为服务器上在生成native code),这个时候Application_Start才真正被执行了。

收获园豆:50
水牛刀刀 | 大侠五级 |园豆:6350 | 2011-11-01 09:54

嗯,对,这个能想通!

那你能给我一个解决方法吗?

还有就是我一直想不通一个问题就是asp.net web应用程序到底是多线程还是单线程呢,比如,当前的站点中存在一个页面,这个页面就是去访问这个站点中的一个唯一的资源,在这种情况下,如果有两个访客,同时去访问这个页面,这个页面就会去访问空上唯一资源,当前IIS会如果处理呢?我看过MSDN但是,还是不是很清楚得!

challengesoflife | 园豆:43 (初学一级) | 2011-11-01 10:02

@challengesoflife: 你的每个web application都会被IIS分配一个线程去执行,然后你可以在你自己的程序里再去开多个线程,这跟IIS是没什么关系的。如果有两个访客同时去访问一个页面,那么他们是不同的线程。你在页面里去访问唯一的资源,就要考虑到线程安全性。比如你在这个页面里去写同一个文件,理论上就有可能有一次是写入失败的。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-11-01 10:15

@challengesoflife: 至于解决方案(也就是如何做到在web站点重启/回收后,就立刻执行application_start,我暂时也没有太好的想法。一个可行的做法就是另外写一个程序(或者windows service),定时去访问这个页面,然后再服务器上定时运行这个程序。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-11-01 10:17

@水牛刀刀: 呵呵,谢谢你啊,解决方案,今天上午我想到了一个,搞定了!

你上面说的 web application 是指什么呢,能具体点吗?因为我理解的话,我就会理解成为一个web 站点去了;

然而,如果如你所说,那么,asp.net 的web应用程序就应是一个多线程的程序了?

challengesoflife | 园豆:43 (初学一级) | 2011-11-01 11:14

@challengesoflife: 你可以理解为一个web站点,是的,它是一个多线程的程序。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-11-01 13:04

@水牛刀刀: 那如你所说的,如果一个web站点是一个多线程的程序,那么,假设当前有一个WEB点,当前有1000个人同时来访问这个站点中的一个页面,那这个站点就产生了1000个线程,IIS能承受吗?如果能承受1000个线程,那更多的话,它还能承受吗?

challengesoflife | 园豆:43 (初学一级) | 2011-11-01 14:03

@challengesoflife: IIS会处理好这种场景的。IIS有多个Queue,你可以想象是请求的队列。如果同时来了1000个,假设IIS的最大并发设置的是60个,那么就会先处理60个,后面的就进入等待队列。一旦请求处理结束,线程池有空闲,就会分配给等待队列里的请求。事实上就算有1000人在用你的系统,并发访问量也不会超过10,我现在所在的项目有几十万注册用户,有几台服务器做负载均衡,并发量都不超过50.你可以在服务器的运行命令里输入perfmon命令来查看IIS的运行情况(包括我刚说的队列情况都可以看到)。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-11-01 16:56

@水牛刀刀: 嗯,说得通,晚上我回去看看,能不能做一个示例程序,来证明一下!

我还有疑问的是,如果当前是50万用户来请求,IIS最大并发量是1000,那排在后面的就会出现访问超时了,那假如排在第40万个用户就开始超时(也就是说40万-50万之间的访问是超时),此时IIS作何处理呢,它又如何处理呢?

challengesoflife | 园豆:43 (初学一级) | 2011-11-01 17:12

@challengesoflife: IIS最大并发量没那么高的,也就50多吧。50万用户不可能同时请求服务器的,哪怕相差1秒,服务器也有足够的时间处理掉之前的请求了。如果真的同时有过多的用户同时请求,那么在用户看来就是非常非常慢,运气好的能打开,运气不好的站点就打不开了。如果长时间这样的话,站点就一直处于拥挤状态,正常用户无法访问,这也是DDOS的原理,此时IIS并不会做任何智能化的处理。要杜绝这种情况可以在IIS里做IP限制,或者用专业的防火墙来对付。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-11-01 17:17

@水牛刀刀: 嗯,可以,呵呵,之前看MSDN的页面生成周期,看了两遍,没有怎么看懂,后来就没有时间看了。近来做点东西,又正好用到,心里一直难受着,现在算是明白很多了。呵呵

水牛刀刀  非常感谢啊

challengesoflife | 园豆:43 (初学一级) | 2011-11-01 17:25

@challengesoflife: 不客气。MSDN还是很有用的,哪怕是英文也得忍着去看。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-11-01 17:26
其他回答(1)
0

IIS回收会导致web app重启。线程当然会dead了。至于为什么没有再respawn,你自己找下原因吧!

Repository | 园豆:610 (小虾三级) | 2011-11-01 09:47

根据IIS帮助文档对应用程序池回收方式的描述如下:

工作进程回收如何工作
根据应用程序池回收的配置方式,万维网发布服务(WWW 服务)可以使用两种方法来回收已分配的工作进程:

1. 默认情况下,WWW 服务建立“重叠回收”,即继续运行要终止的工作进程,直到启动新的工作进程后为止。
2. 或者,WWW 服务可以终止一个工作进程,然后启动一个新的工作进程(如果工作负荷允许执行此操作的话)。

我没有设置回收方式,当前就应是默认方式, 在默认方式下,它应先给我建一个新线程啊,但是怎么就没有呢?

支持(0) 反对(0) challengesoflife | 园豆:43 (初学一级) | 2011-11-01 09:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册