IIS App Pool,内存管理

时间:2014-01-30 17:00:16

标签: c# wcf profiling iis-7.5 .net-4.5

我在IIS 7.5上托管了RESTful WCF服务。当调用某些操作时,它几乎立即返回,但是启动一个复杂的任务,处理组合并在内存中打开大文件。在几次请求之后,应用程序池正在使用大约50%的内存,尽管任务已经完成。 IIS池什么时候回收内存?我试着打电话给GC.Collect(),但什么都没发生。有没有办法分析像这样的应用程序?我尝试了几个分析器,但它们只显示.NET类,IIS用它来处理请求本身。

3 个答案:

答案 0 :(得分:3)

工作进程本身不会自行向操作系统释放内存。您可以将进程设置为按计划进行回收 - 这会重新启动进程释放内存而不会干扰正在运行的请求。

你可能不应该这样做 - 基本上.net持有内存以避免为以后的请求重新分配它。内存可在WCF进程中重用,如果未使用内存,操作系统会将其分页并允许在其他进程需要时重用它。有关详细信息,请参阅Answer to When is memory, allocated by .NET process, released back to Windows

答案 1 :(得分:3)

长时间运行的任务通常不适合Web应用程序,因为它们会超时/挂起网站/ API的响应性 是否可以将后台任务配置为以异步方式运行IIS站点?因此,您可以将这些缓慢的任务推送到队列中并在后台处理它们

我认为这个过程中的内存使用情况是一个问题,但并不能说明整个故事,到目前为止您设法分析了什么?你有未闭合的联系吗?您是否正在创建多个未被有效处理的类的实例?我想查看调用执行计划的内容而不是内存使用情况,因为它可能会引导您更多地调用项目所在的位置

当你说50%的记忆我们在mb中实际谈论了多少?当它不需要放弃RAM时,IIS可能有点贪婪/懒惰

答案 2 :(得分:1)

我有几乎类似的问题,我使用Castle.Windsor作为IoC容器解决了它,将svc客户端类添加到带有Transient Scope的容器中,最后,我用以下内容装饰了svc类:         [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]。

所有其他依赖绑定都添加了Transient Livestyle,从而使它们依赖于它们的实例化器。我不确定这会对您的情况有所帮助,因为您使用大文件,但如果其他任何事情都失败了,请尝试在大多数内存容器类上实现IDisposable,并检查是否应该调用Dispose。

希望有所帮助!