应用程序池在回收的时候,会新建一个w3wp.exe来处理新请求,而老w3wp.exe也会在处理完已接受的请求后会自动死掉,因为maximum worker processes设置为1的关系,所以,只会存在1个w3wp.exe,但是,理论很丰满,现实很骨感,现在站点运行一段时间后,估计是默认时间到了会回收应用程序池后,会出现多个w3wp.exe,而每个进程都占用2GB以上的内存,理论上来说,这些“多出来"的进程应该是要死掉才对的,有这方面经验的朋友吗?
w3wp的进程是基于应用程序池的,如果有多个应用程序池就有多个进程甚至更多。因为一个应用程序池至少一个进程。
而你设置的最大工作进程为1是指一个应用程序池的情况。
是啊,只有一个应用程序池,工作进程也设置为1个。
@dotnetgeek: 这个这个就有点奇怪了。楼下的说什么线程,这个不会出现这样的问题的,线程是依附于进程的,不会因为使用多线程导致多个进程的。
我觉得,你还是把IIS的所有其它站点、应用程序池都停止了,把所有的w3wp都关闭了,再实验看。很有可能是有其它的服务(比如 IIS EXPRESS 或其它类似的 WebHost )在运行导致的。
@519740105: 生产环境出现,只装了IIS
@dotnetgeek: 那这个问题可能就要具体分析了。
我刚看了我的工作电脑,没访问网站,也没调试,系统是没W3WP的。
其它的可能只能从你的系统安装的应用着手了。
是不是有子线程在跑,导致进程退不出,然后越来越多
一开始我也怀疑这个,因为书中说到如果有还没有处理完的任务的话,就不会退出,所以我做了一个实验,就是应用程序已启动的时候,就新开一个异步Task死循环的在做一些事情,但是,我去回收应用程序池的时候,也没重现啊,也不会出现2个进程。
@dotnetgeek: 我对Task进行了测试,发现其行为类似于后台线程,在程序退出后自动停止,不会阻挡程序退出,你可以使用System.Threading.Thread试试
@诶碧司: 是的啊,所以,就排除了这个原因。