MVC+MEF+UnitOfWork+EF架构,网站速度慢的原因总结!(附加ANTS Memory Profiler简单用法)
(最近使用内存分析工具ANTS Memory Profiler,以及其他网友提供的意见发现最终导致内存泄漏的就是MEF,在此特地更新下,与大家分享!最下面红色字体)
最近参考使用了郭明峰的一套架构来做新的项目架构,这套架构看起来还是不错的,先向小郭同学的分享精神致敬!
(郭同学的项目文档:http://www.cnblogs.com/guomingfeng/archive/2013/05/19/mvc-overall-design.html)
项目开发上线后,傻眼了,貌似没有几个人访问的新项目,速度一直慢的跟牛一样,真心没法交差啊。上面发下话了,解决不了就可以走人了。压力可想而知。
接下来就是苦逼的找原因了。
症状:1、内存占用高,8g的内存很快就能吃完
2、网站相应速度慢,firebug检测每次都是在等待
根据这些症状,感觉是内存泄露了,于是memory profiler。。。什么性能分析工具都用上了,怎奈水平有限,不会使用这些高级玩意,一番折腾下来,就剩下无奈。
但总不能放弃,对比之前做的mvc项目,就是多了entityframework、MEF这两样,看样子也就这两块的原因了,EF的嫌疑最大,而且首次使用,并不了解。于是,接下来又是一段苦逼的研究;功夫不负有心人,根据目前研究的结果及上线的效果来看,基本上找到了问题的所在。总结下,与诸位分享,高手忽略。
问题原因:1、很多数据查询一次性读入到内存中,导致内存增加。
2、上下文对读入到内存中的数据对象会进行跟踪,导致内存不断攀升,疑似内存泄露
解决办法:1、深入学习EF,监控每一步生成的sql语句,防止无用数据的调取
2、网站大部分的数据在读取的时候是不需要进行上下文跟踪的,一定要禁止跟踪,否则内存就会爆了!代码如下:
/// <summary>
/// 获取当前实体的查询数据集(通过读上下文进行读取,只读专用,返回的实体数据不会被上下文跟踪)
/// </summary>
public virtual IQueryable<TEntity> ReadEntities
{
get { return WriteContext.Set<TEntity>().AsNoTracking(); }
} /// <summary>
/// 获取当前实体的查询数据集(通过写上下文进行读取,修改专用,返回的实体数据会被上下文进行跟踪)
/// </summary>
public virtual IQueryable<TEntity> WriteEntities
{
get { return WriteContext.Set<TEntity>(); }
}
说明:我在仓储模式中,对读取实体集合进行了修改,ReadEntities表示不需要进行跟踪的,加上AsNoTracking方法;WriteEntities表示是需要跟踪的,用于修改实体信息使用。这样以来,所有的症状全部消失了。
当然,也许有更好的优化方法,至少目前本人发现了这些问题所在,而且微软的白皮书中确实也讲的了EF的性能注意事项,怎奈仓促开发,对EF毫不了解,罪过罪过!大家引以为鉴!
另外,还遇到一个问题,不知道是否是DBcontext线程冲突问题,大家帮分析下,谢谢:
持续的内存泄漏问题终于有了结果了,花了近一周的时间,无数苦逼的熬夜,终于掌握了ANTS Memory Profiler的基本用法,结合之前网友的宝贵意见,经检测,终于发现导致内存泄漏的罪魁祸首:MEF。
小郭的架构中有这么一段代码:
public CompositionContainer Container
{
get
{
CompositionContainer container;
if (!HttpContext.Current.Items.Contains(MefContainerKey))
{
container = new CompositionContainer(_catalog, CompositionOptions.DisableSilentRejection);
HttpContext.Current.Items.Add(MefContainerKey, container);
HttpContext.Current.DisposeOnPipelineCompleted(container);
}
else
{
container = (CompositionContainer)HttpContext.Current.Items[MefContainerKey];
}
return container;
}
}
这段代码用于创建MEF容器,并向其中加入对象实例化的目录。
小郭童鞋说了,项目中的所有Import的对象都是MEF创建的,不需要刻意的去Dispose,只要MEF对象释放了,那么container中的所有实例化对象就会被释放。
话没错,但代码中确实没有看到有释放container对象的地方,我翻遍了评论,看到有个哥们ltcszk提醒说要加入HttpContext.Current.DisposeOnPipelineCompleted(container)这句话就ok,当时并未重视,固执的认为是过多的DBContext导致的,这两天经过ANTS Memory Profiler测试下,果真是这个问题导致的,加上这句话,效果立竿见影,在此感谢ltcszk的提醒。同时总结下,与诸位分享!
在页面打开后,理论上这次请求就完毕,所有线程中创建的对象就应该被GC释放掉,Profiler在每次快照的时候就会执行GC的回收,那么实际的情况我们看下
优化前:
内存状况:
第一步
第二步
第三步
优化后:
驻留在内存中的类型明显少了很多,只有35个,大部分是cache内容!
在此记录,与诸位分享,欢迎拍砖!
MVC+MEF+UnitOfWork+EF架构,网站速度慢的原因总结!(附加ANTS Memory Profiler简单用法)的更多相关文章
- MVC UnitOfWork EntityFramework架构
MVC UnitOfWork EntityFramework架构,网站速度慢的原因总结! 最近参考使用了郭明峰的一套架构来做新的项目架构,这套架构看起来还是不错的,先向小郭同学的分享精神致敬! (郭同 ...
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
- Nginx网络架构实战学习笔记(三):nginx gzip压缩提升网站速度、expires缓存提升网站负载、反向代理实现nginx+apache动静分离、nginx实现负载均衡
文章目录 nginx gzip压缩提升网站速度 expires缓存提升网站负载 反向代理实现nginx+apache动静分离 nginx实现负载均衡 nginx gzip压缩提升网站速度 网页内容的压 ...
- MVC 5 Scaffolding多层架构代码生成向导开源项目
asp.net MVC 5 Scaffolding多层架构代码生成向导开源项目(邀请你的参与) Visual Studio.net 2013 asp.net MVC 5 Scaffolding代码 ...
- EF架构~基于EF数据层的实现
回到目录 之前写过关于实现一个完整的EF架构的文章,文章的阅读量也是满大的,自己很欣慰,但是,那篇文章是我2011年写的,所以,技术有些不成熟,所以今天把我的2014年写的EF底层架构公开一下,这个架 ...
- MVC模式与三层架构的区别
之前总是混淆MVC表现模式和三层架构模式,为此记录下. 三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层) 三层架构(3-tier application) ...
- MVC中使用EF(2):实现基本的CRUD功能
MVC中使用EF(2):实现基本的CRUD功能 By Tom Dykstra |July 30, 2013 Translated by litdwg Contoso University示例网站 ...
- PHP Yii框架开发——组织架构网站重构
最近一段时间在维护公司的组织架构网站(Org),旧版网站只是用了xampp简单搭建了一套环境部署在了windows机器上,代码结构相对简单. 整个架构如下: 整个架构没有用到复杂的结构,class里放 ...
- MVC 4 插件化架构简单实现实例篇
ASP.NET MVC 4 插件化架构简单实现-实例篇 先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集 ...
随机推荐
- dispatch队列
GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用.所以说,结合bloc ...
- Distinct Substrings
spoj694:http://www.spoj.com/problems/DISUBSTR/ 题意:给以一个串,求这个串的所有不同子串的个数. 题解:第一次接触后缀数组,这里可以转化成,求所有子串后缀 ...
- Spring整合CXF,发布RSETful 风格WebService
原文地址:http://www.cnblogs.com/hoojo/archive/2012/07/23/2605219.html 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有 ...
- 修改Delphi工具控件的默认字体
修改Delphi工具控件的默认字体: 注册表: Delphi 6: HKEY_CURRENT_USER\Software\Borland\Delphi\6.0Delphi 7: HKEY_ ...
- leetcode面试准备:Decode Ways
1 题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: ...
- 《Apache Spark源码剖析》
Spark Contributor,Databricks工程师连城,华为大数据平台开发部部长陈亮,网易杭州研究院副院长汪源,TalkingData首席数据科学家张夏天联袂力荐1.本书全面.系统地介绍了 ...
- gitweb安装
gitweb安装: 1. 简介 Gitweb提供了git版本库的图形化web浏览功能.可以到网站http://git.kernel.org/体验下效果,如下图所示. Gitweb界面 它既可以通过配置 ...
- TCP/IP FTP/TFTP
引言 从一台计算机向另一台计算机传送文件是在连网或互联网环境中最常见的任务.而FTP和TFTP就是这样的协议. 关于文件传输协议FTP? 端口21使用服务TCP [FTP模型] FTP连接? 1.控制 ...
- 两次fopen不同的文件返回相同的FILE* 地址
最近接触一个垃圾程序,出现一个奇怪的bug,现象是两次fopen不同的文件返回相同的FILE*地址,第二次返回的FILE*有时候无端端的就被关闭了.以下代码是对这个bug的概括: auto fp1 = ...
- HDU 4722 Good Numbers 2013年四川省赛题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 题目大意:给定一个区间,求区间中有多少个满足每位上的数的和是10的倍数. 解题思路:先打表暴力求 ...