首页 > 代码库 > 问题很老,但是经常忘记,所以还是记录一笔: 关于IIS session老是丢失的问题

问题很老,但是经常忘记,所以还是记录一笔: 关于IIS session老是丢失的问题

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

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

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

首先了解下应用程序池

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

再来了解下Web园

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

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

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

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

  1. 每一个工作进程都会消耗系统资源和CPU占用率,太多的工作进程不仅会导致系统资源和CPU利用率急剧消耗,还会造成资源竞争;
  2. 每一个工作进程都具有自己的状态数据,由于请求以循环的方式路由到应用程序池工作进程,这就造成数据不一致,比如session丢失等;

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

问题很老,但是经常忘记,所以还是记录一笔: 关于IIS session老是丢失的问题