.NET网站巨大的峰值工作集内存

时间:2014-08-07 14:49:40

标签: c# asp.net .net memory-leaks iis-7

我在共享服务器上有一个asp.net/c# 4.0网站。

os Windows Server 2012运行的是IIS 7,拥有32GB内存和3.29GHz处理器。

服务器一次又一次遇到困难,例如RDP和其他PHP网站运行缓慢的问题。

我们的系统管理员建议我的网站可能存在这些问题并导致这些问题。

在任何时候,网站"内存(私人工作集)"是2GB,最高可达15GB。

我在服务器上运行了 JetBrains dotMemory 的试用版,附加到网站的w3wp.exe进程。我第一次使用这个程序,我是一个完整的新手。

我使用dotMemory拍摄了两张内存快照。

可以在此处查看基本快照比较:http://i.imgur.com/0Jk8yYE.jpg

从上面的比较中我们可以看到System.String和BusinessObjects.Item是具有最多幸存字节的两个项目。

深入研究system.string我可以看到主要的幸存对象是 System.Web.Caching.CacheEntry 135MB 。请参阅screengrab:http://i.imgur.com/t1hs8nd.jpg

这让我怀疑是否可能会缓存太多?

我缓存来自我的数据库的所有数据:HTML页面内容,导航菜单项,页面之间的关系&儿童,文章等。使用 HttpContext.Current.Cache.Insert

将缓存超时设置为10080分钟。

我的问题:

1 - 是2GB内存(专用工作集),对于32 GB Ram的服务器,峰值高达15GB?

2 - 我是否正确使用了dotMemory来识别问题?

3 - 我的缓存是一个问题吗?

4 - 可能的其他原因?

5 - 可能的解决方案?

由于

1 个答案:

答案 0 :(得分:0)

使用大量内存本身不能减慢程序的速度。它可以放慢速度

  1. 如果windows主动使用交换文件。请管理员查看此案例
  2. 如果.NET程序导致垃圾收集过多(产生过多的内存流量)
  3. 您可以在dotMemory中查看内存流量信息。不幸的是,如果附加到程序中它无法收集此类信息,收集对象创建堆栈跟踪和内存流量信息的唯一方法是在dotMemory profiler下启动程序,启用相应的设置。

    <强> BUT! 问题是您无法评估内存流量“N”是高还是不高,找到性能问题根的唯一方法是使用性能分析器

    例如JetBrains dotTrace可以告诉你,你在垃圾收集中花费了多少时间,只有这是一个瓶颈,你应该使用内存分析器找到一个流量根。

    结论:首先尝试使用性能分析器找到瓶颈。 然后,如果您对dotMemory仍有疑问,请问我,我会尽力帮助您:)