【问题标题】:.NET Website Huge Peak Working Set Memory.NET 网站巨大的峰值工作集内存
【发布时间】:2014-08-07 14:49:40
【问题描述】:

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

操作系统 Windows Server 2012 运行 IIS 7,具有 32GB 内存和 3.29GHz 处理器。

服务器时不时遇到困难,例如RDP'ing和其他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。看截图:http://i.imgur.com/t1hs8nd.jpg

这让我怀疑我缓存太多了?

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

缓存超时设置为 10080 分钟。

我的问题:

1 - 是 2GB 内存(私有工作集),对于具有 32GB 内存的服务器来说,峰值高达 15GB?

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

3 - 我的缓存有问题吗?

4 - 可能的其他原因?

5 - 可能的解决方案?

谢谢

【问题讨论】:

  • 来自 dotMemory 的更多屏幕截图:imgur.com/3ir5OFc
  • 你能描述一下你的代码吗?有List()吗?特定的课程?
  • @Tinwor - 缓存中存储了许多列表。 Item 是我的自定义类,它具有 PageBody 之类的属性,用于存储新闻文章的正文 html。还有许多单独的项目存储在缓存中。
  • 你在做什么不是一个好习惯。我建议您仅在需要时从 db 获取信息。你也烧 ram(想想这个:一个 500 个元素的列表,这个列表有 500 个 Istance,每个用户一个)
  • @Tinwor 我只在需要时才访问数据库——这就是我使用缓存的原因。而不是每次我将它存储在缓存中时都点击数据库。缓存是服务器缓存 - 因此即使 500 个用户也只有一个实例。服务器 cahce 由所有用户共享 - 对吗?

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


【解决方案1】:

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

  1. 如果 Windows 主动使用交换文件。请管理员检查此案例
  2. 如果 .NET 程序导致垃圾收集过多(产生过多内存流量)

你可以在dotMemory中看到一条内存流量信息。不幸的是,如果它附加到程序,它就无法收集这些信息,收集对象创建堆栈跟踪和内存流量信息的唯一方法是在 dotMemory profiler 下启动您的程序,启用相应的设置。

但是! 问题是您无法评估内存流量“N”是否高或否,找到性能问题根源的唯一方法是使用性能分析器

例如 JetBrains dotTrace 可以告诉您,您的程序在垃圾收集上花费了多少时间,并且只有在这是瓶颈的情况下,您才应该使用内存分析器来查找流量的根源。

结论:首先尝试使用性能分析器找到瓶颈。 那么,如果你还有关于 dotMemory 的问题,可以问我,我会尽力帮助你:)

【讨论】:

  • 感谢您的回复,系统管理员说它默认使用交换文件,因为它的 Windows Server 2012,他没有设置交换文件,但他说 windows 默认有交换文件。不是我的地区,所以我不会知道。那么 - 在这个具有 32GB 内存的 Windows Server 2012 上,2GB 和峰值高达 15GB 的“内存(私有工作集)”是否会成为问题?我会调查你所说的关于性能分析器的内容。
  • “在 32GB 内存的 Windows Server 2012 上,2GB 和峰值高达 15GB 的“内存(私有工作集)”是否会成为问题?在我看来,这不是问题(性能问题的根源)。
  • 好的,谢谢 - 我将其标记为已回答,因为:我们的系统管理员将站点标记为 可能 问题的原因是因为他看到它的内存使用量很大.不是它的处理器性能。因此,它的内存使用似乎与服务器问题无关。与此同时,系统管理员发现服务器上的 PHP 站点存在问题,我们现在认为这可能是问题所在。
  • 收集对象创建堆栈跟踪和内存流量信息的唯一方法是在 dotMemory profiler 下启动您的程序,启用相应的设置。为什么它有这个限制? @爱德华·沃德?我有一个 asp.net 应用程序。它需要建立非常巨大的本地缓存。使用设置附加 dotMemory 导致应用无法构建所有缓存,否则将导致两个小时来构建部分缓存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多