会话在 64 位应用程序池中短时间后被终止

Posted

技术标签:

【中文标题】会话在 64 位应用程序池中短时间后被终止【英文标题】:Sessions are killed after short time in 64bit application pool 【发布时间】:2015-11-04 05:42:37 【问题描述】:

我们有一个托管在 IIS 7.5 上的 .net Web 应用程序。 早些时候,这个应用程序在 32 位应用程序池上运行,但前段时间我们已经切换到 64 位应用程序池。

最近用户开始抱怨在闲置 1-2 分钟后他们的会话被终止,我们今天已经确认了这一点。

在 web.config 文件中,会话超时设置为 60 分钟。 我们还在任务管理器中注意到,这个应用程序的 w3wp 进程消耗了大约 2-2.4GB 的内存,所以问题可能是应用程序池正在尝试回收一些内存?

回收设置为有限时间段 21:00 和 4:00

会话出现此问题的原因可能是什么?

编辑:

我检查了一些计数器并进行了基本的内存转储分析,但没有发现任何问题。

在转储 eeheap 分析中,我只看到每个堆大约 10-30MB 的第 2 代对象,我有 24 个对象

堆0(0000000003083a90)代0开始于0x00000000fff568b8代1点开始于0x00000000ffa6acf0第2点开始于0x00000000ff471000短暂的段分配上下文:无段开始分配的大小00000000ff470000 00000000ff471000 00000000ffff8de0 0xb87de0(12090848)大于0x00000006ff471000段对象堆BEGIN开始分配的大小00000006ff470000 00000006ff471000 00000006ff7495c8 0x2d85c8(2983368) 堆大小:大小:0xe603a8 (15074216) 字节。

堆1(00000000030889c0)代0开始于0x000000013fc36ed8代1点开始于0x000000013f949348第2点开始于0x000000013f471000短暂的段分配上下文:无段开始分配的大小000000013f470000 000000013f471000 000000014035e7b8 0xeed7b8(15652792)大于0x0000000703471000段对象堆BEGIN开始分配的大小0000000703470000 0000000703471000 00000007035c5d58 0x154d58(1396056) 堆大小:大小:0x1042510 (17048848) 字节。

编辑:2015-08-19 09:00 这些是 2015-08-19 09:00 的计数器

让我担心的是为什么任务管理器中的内存显示为 2.5GB,而所有堆中的字节数仅显示约 100MB,为什么私有字节 (216MB) 比所有堆中的字节大? 当前的负载是这台服务器上大约 40 个用户。

编辑 2015-08-19 14:09

一段时间后,我发现程序集可能存在问题。 当我在没有 !dda 命令的 .NET 4.5 上时,如何使用 windbg 进行检查?

【问题讨论】:

你那里有非托管代码吗? 您是否在负载平衡的基础架构中托管网站?您使用的是 InProc 会话还是 Sql? 我认为这个应用程序中没有非托管代码。在负载平衡基础架构方面,我们使用默认的 windows 功能,两台服务器托管此应用程序。是的,会话模式是 InProc。 您是否在任务管理器中确认进程实际上以 64 位模式运行(在每个服务器上)?您没有更改空闲超时时间吗? 是的,该进程肯定在 64 位模式下运行。我很确定超时设置正确(我明天会发布一些设置)。当大约有 30-40 个用户时,一切似乎都可以正常工作,但后来当有大约 70-90 个用户时,就会出现这些会话问题。 【参考方案1】:

尝试将正在运行的应用程序复制到不同的池中,但在这个新池中禁用所有不需要的程序集/引用,以查看正在执行的操作。

就像你说的,我认为某些汇编程序正在使您的应用程序池崩溃,可能是因为可能不支持 64 位。

尝试禁用所有不使用的引用,全部更新等。

【讨论】:

以上是关于会话在 64 位应用程序池中短时间后被终止的主要内容,如果未能解决你的问题,请参考以下文章

在同一应用程序池中的 64 位应用程序中使用 32 位 dll

用于快速会话的 Ephemeral 和 MaxAge

Java Hibernate 会话没有被正确终止

应用程序终止时的 NSURLSession 后台会话回调

IIS应用池"启用32位应用程序"导致Service Unavailable

配置:使安装在64位系统上的IIS7支持32位的应用程序