2

如果 ASP.NET 应用程序(使用 ASP.NET 线程池,同步请求处理)长时间运行(> 30 分钟),则在 windows server 2008 64 位、IIS 7.0 和 .NET 4.0 下。Web 应用程序没有页面,主要目的是以块(~5 MB)读取大文件(> 1 GB)并将它们传输到客户端。代码:

while (reading)
{
    Response.OutputStream.Write(buffer, 0, buffer.Length);
    Response.Flush();
}

单一生产者 - 实现了单一消费者模式,因此每个请求都有两个线程。我在这里不使用任务库,但请告诉我在这种情况下它是否比传统的线程创建更有优势。使用 HTTP 处理程序 (.ashx) 代替 (.aspx) 页面。在压力测试下,CPU 利用率不是问题,但是对于单个工作进程,在 210 个并发客户端之后,新连接会遇到超时。这可以通过网络园艺解决,因为我不使用会话状态。我不确定我是否遗漏了任何大问题,但请让我知道您认为应该考虑哪些其他因素?

例如,由于“连接超时”,IIS 可能会关闭长时间运行的 TCP 连接,因为正常的 ASP.NET 页面在 5 分钟内处理完毕,所以我应该增加该值。

我很欣赏你的想法。

4

5 回答 5

2

就个人而言,我会为这种类型的处理寻找一种不同的机制。HTTP 请求/Web 应用程序不是为这种类型的事情而设计的,稳定性将非常困难,当您使用这种类型的模型时,您会面临许多可能导致重大问题的风险。

我会将该处理移至后端进程,以便您在 asp.net 运行时之外,这样您就可以更好地控制启动/关闭等。

于 2010-10-22T18:30:54.483 回答
2

首先,从不。绝不。绝不!在线程池线程中执行任何需要超过几秒钟的处理。它们的数量有限,并且它们被系统用于许多事情。这是自找麻烦。

其次,虽然处理程序是一个好主意,但您对“动态生成”的含义有点模糊您的意思是您正在动态加密文件并且此加密可能需要 30 分钟?或者你的意思是你从数据库中提取数据并组装一个文件?或者下载需要30分钟才能下载?

编辑:

正如我所说,不要将线程池用于任何长时间运行的东西。创建您自己的线程,或者如果您使用的是 .NET 4,请使用 Task 并将其指定为长时间运行。

于 2010-10-23T18:14:05.940 回答
1

不应以这种方式实现长时间运行的进程。将此传递给您设置的服务。

如果您确实想为客户端挂起页面,请考虑从 AJAX 连接到不会阻塞 IO 线程的东西 - 例如 node.js。

由于线程使用,向许多客户端推送通知不是 ASP.NET 可以处理的,因此我的 node.js。如果您的负载较低,您还有其他选择。

于 2010-10-22T18:31:54.200 回答
0

Web 1.0 处理长时间运行的进程的方法是在服务器上生成它们并立即返回。让衍生服务更新具有进度的数据库,并且站点上的页面可以查询进度。

这种技术最常见的用法是获得包裹递送。在我的包出现之前,您无法保持 HTTP 连接打开,因此它只是为您提供了一种查询进度的方法。后台进程负责编排获取物品、包装物品、将其运送到 UPS 卡车等所需的所有步骤。在此过程中,每个步骤都记录在数据库中。从概念上讲,它是相同的。

根据问题编辑编辑:只需立即返回结果页面,并在生成的线程或进程中在服务器上生成二进制文件。使用 Ajax 检查文件是否准备就绪,并在准备就绪时提供指向它的链接。

于 2010-10-22T18:50:08.977 回答
0

使用 Web-Gardening 来提高应用程序的稳定性。

关闭缓存,因为您没有 aspx 页面

如果没有性能分析,很难提供更多建议。你 VS 内置并找到瓶颈。

于 2010-11-01T17:53:24.423 回答