2

.net 2.0 aspx app / IIS6 在 w3wp.exe 进程应用程序池中创建大量线程。

该应用程序已通过以下设置隔离到其自己的应用程序池:

回收

回收工作进程(以分钟为单位):870 回收工作进程(请求数):(未勾选)在以下时间回收工作进程:00:00 最大虚拟内存:(未勾选)最大使用内存(以 mb 为单位):1000mb (1GB)

表现

空闲后关闭工作进程(时间以分钟为单位):20 限制内核请求队列(请求数):1000 启用 cpu 监控(%):85 刷新 cpu 使用次数(以分钟为单位):5 当 cpu 使用率超过时执行的操作最大 cpu 使用:无操作(保持会话)最大工作进程数:1

健康

启用 ping(检查) ping 工作进程每(秒):30 启用快速故障保护(检查)故障:5 时间段(以分钟为单位):5 启动时间限制 - 工作进程必须在(秒)内启动:90 关闭时间限制 -工作进程必须在(秒)内关闭:90

正常运行会看到 w3wp.exe 进程使用 300MB 内存和 50 拉德。当我的问题发生时,线程数慢慢增加到 10,000 ,在线程被击回 0 之前内存增加到 1GB。 w3wp.exe 进程没有关闭,我的用户没有注销(至关重要),即他们保持他们的会话并且不必须重新登录。尽管标准的 50 根线在 10,000 根胭脂线中被杀死。

1) 专家可以就上述应用程序池设置提供任何优点/缺点吗?

2)“max used mem”设置似乎在自动处理这个问题(通过杀死线程,保持会话活动,但有人可以解释为什么吗?......我认为线程与会话无关) .

该应用程序使用基于服务器的会话,但我们存储了一个本地 cookie 进行身份验证。

4

1 回答 1

2

线程

10k 线程非常高,而且您的线程在处理器上下跳动上花费的时间比实际工作要多。又名颠簸。

编辑:我在这里假设它是一个 .NET Web 应用程序。

您的应用程序是否使用 ThreadPool 或 BackgroundWorkers?似乎您必须使用 IIS 的标准线程随行人员(每个处理器只有大约 4 个)以外的其他机制才能达到 10k 线程。

记忆

除了用于工作的内存之外,每个线程还需要内存来跟踪,因此从线程的绝对数量来看,您可能已达到 1G 的限制。

会议(我会活下来!)

应用程序可能已设置为将会话状态存储在持久存储或会话状态服务中。在这种情况下,可以安全地回收工作进程而不会丢失用户状态信息。如果会话状态(在 Web.config 中)配置为 In-Proc,则在工作进程回收时会话状态将丢失。

工作流程回收

另一件值得注意的事情是,在一个工作进程死亡之前,另一个工作进程被设置并开始取代它。在这个进程的某个地方,您可能会看到 w3wp.exe 进程(旧的或新的)有 0 个线程。

BackgroundWorkers 就像兔子一样

如果您的线程执行的工作持续时间超过 1 秒(实际上是 1/2 秒),请不要使用 BackgroundWorkers。除非您更改 ThreadPool 的最大线程数(不建议这样做,因为这会破坏 .NET 中更深层次的功能),否则对可以同时运行的 BackgroundWorker 的数量没有硬性(足够)限制。在这种情况下,最好使用生产者消费者队列模型。

看看这个网站。这是一个很棒的并发编程资源,有很多模型和例子。

于 2009-11-19T16:34:49.543 回答