【发布时间】: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