问题很老,可是常常忘记,因此仍是记录一笔: 关于IIS session总是丢失的问题

最近服务器出现了几个问题:多个.NET版本形成网站瘫痪和Session丢失。服务器

针对第一个问题可以使用多个应用程序池来解决;第二个采用了把session存在aspnet_state进程中(aspnet_state进程独立于w3wp.exe);session

但对第二个问题很纠结,为何Session存在w3wp进程中会丢失,以前猜想多是其余应用程序占用内存太大,以致于系统回收内存把session给回收了。但继续研究才发现有3个w3wp进程,这事因为Web园被设置了。下来来理解下相关概念和原理:性能

首先了解下应用程序池网站

应用程序池是一个工做进程或多个工做进程的集合,默认状况下每一个应用程序池都会有一个工做进程(w3wp.exe)与之对应,因为工做进程是相互隔离的,因此一个应用程序池发生问题不会对已另外一个应用程序池中的应用程序形成影响。这也被常被用于解决多个.NET版本问题。spa

再来了解下Web园进程

一个应用程序池默认是开启一个工做进程,但也能够开启多个工做进程,这样可提升性能,这个功能名为Web园,是小型的“Web农场”,您无需使用多台计算机来传送相同内容(Web农场),而是可使用一台计算机中的多个进程来传送相同内容。
配置Web园:内存

IIS6->应用程序池->选中使用的应用程序池->右键属性->性能->Web园->最大工做进程数资源

IIS7->应用程序池->选中使用的应用程序池->高级属性->进程模型->最大工做进程数路由

设置最大进程数大于1,若是这个值大于1,每一个请求将启动一个新的工做进程实例,可启动的最多进程数位您所设置的进程数,最大可设置为4000000.后续请求将以循环的方式发送至工做进程。但使用Web园要考虑如下两点:io

  1. 每个工做进程都会消耗系统资源和CPU占用率,太多的工做进程不只会致使系统资源和CPU利用率急剧消耗,还会形成资源竞争;
  2. 每个工做进程都具备本身的状态数据,因为请求以循环的方式路由到应用程序池工做进程,这就形成数据不一致,好比session丢失等;

还有些朋友发现有多个w3wp进程,很不理解,有些朋友甚至认为是病毒。其实这彻底和Web园的设置有关,一个工做进程就是一个w3wp.