接触过entityframework codefirst开发模式的应该知道,codefirst开发模式里的数据库访问上下文就是这么个模式,起码微软给的例子,园子里的大叔大姐们也是用的这么个例子:
1 public class kk_DB:DbContext 2 { 3 public kk_DB() 4 : base("test") 5 { 6 7 } 8 9 public DbSet<Special> Specials { get; set; }
似乎这没有问题。可是真正你运用的项目中去你会发现,只要这里的类似specail的表上百张的话,那么你这个程序,就算首页代码只获取其中的一张表里的一条数据(前提我的linq to sql 写的没问题,没有把所有的数据加载到本地然后查询),那么你的w3wp.exe进程内存也会上百兆或者200兆,不敢想象如果再多些表呢?小弟用vs2010的性能向导测试过,惊人啊,求解,难道entiry framework ORM就是这么个效果,还是小弟自己不会写呢??
附带具体同病相怜哥儿们的帖子链接http://social.msdn.microsoft.com/Forums/zh-CN/d82d82be-f128-49cb-b09f-1fff982776ce/entity-framework
我怀疑是初始化的时候进行了全表查询,把所有的数据都加载到本地了,可问题是我没写过这样的加载代码啊!!!
最新进展:用dapper替换原有的entityframework进行操作首页,内存降到70M左右,因为.NET web程序一个空程序也是需要占据大概28-30M的W3WP.EXE内存的。所以drapper果然牛逼啊
试下cyq.data的code first模式。。
你指定把所有数据加载到本地了。
关键是我专门新建了一个项目,除了重新dbcontext,别的没什么代码,就在首页写了类似的代码
using(**DB objdb=new **DB) { list<special> list=objdb.spacials.where(ID=1).tolist(); }
别的我什么都没写了,难道他kk_DB初始化的时候就加载了吗?
看看sql profile就知道是不是初始化就加载数据了,ms不会这么傻的,应该还是你使用的问题吧。
是使用上的问题,建议检查一下EF相关代码
老大,我另外新建的空MVC3,随便几行代码w3wp.exe也要上60M,而且我另外做了个测试。用dapper,然后用vs2010的性能内存检测,首页打开也就十来兆(检测数据),不过一看W3WP.EXE就又是100多了。邪门了
@flyjonson: 100多M带来了什么问题?
@dudu: 或许我敏感吧,因为discuz或者别的asp程序什么的,W3WP.EXE的内存占用即便几百人上千人访问,都不是也才100多,没有说像我这样一开始就100多的,邪门的是我用sqlprofiler监视了,压根就没什么问题,linq to sql 生成的语句也没问题,也没说加载所有的数据到本地(因为数据库就是空的),怎么就一个空的网站加几句linq to sql 就到70M了,不过我用dapper就不同了,我把原来的项目改了。立马就下来了,对了咱们博客园的W3WP.EXE多大啊?小弟,初来乍到,没有个见识,一个多少流量的网站,应该差不多是多少的内存占据什么的没个考量。老大应该以博客园为蓝本,把一些常规化数据(不私密的那种)和园子中的小弟们分享下,我发现很多很牛叉的技术教程参考代码都有,但是唯独很简单的一些参考数据,比如一个10000人访问的.NET程序,应该是多少的内存占据范围,一个多少流量的程序应该配置怎么样的硬件,因为毕竟像博客园这样在alexa排名如此靠前的技术性网站在很多方面的经验都是很宝贵的,而商业网站是不可能分享一些技术参考数据的。而一些小程序员因为本身所处环境的特点,他们即便分享经验,而那些经验是没有经过大流量考验的。园子里技术代码模式理论都不少,唯独缺少类似博客园这样大流量网站的实践经验和数据参考。我感觉我在写代码,和微软官方的例子一样,但是似乎真正运营的大型网站是如何的呢?不得而知了!!因为多数程序员没有机会进入大的公司,而大的公司也极少会分享类似的经验数据。感觉走在云端似的,不知道自己写的代码是否是经的起考量的。望老大考虑考虑。
@flyjonson: 博客站点,两台Web服务器做负载均衡,每台Web服务器2个w3wp做Web Garden,每个w3wp.exe占用1G多一点内存
先用SqlProfiler监视下,贴出结果,再看其他~
用sqlprofiler监视过,确实没有,一个新建的空ASP.NET MVC3一运行,W3WP.EXE就大概28-30M左右,然后似乎稍微写一两行数据库交互的代码就直接上60M了,这似乎看来一个稍微成型的项目,W3WP.EXE超过100M也无可厚非了,即便不是MVC3,而是建一个空的web程序,也是如此,无语了。难道现在的.NET 程序和NT一样,水涨船高,起始内存越来越大。
@flyjonson: 不影响过多就好。现在的程序越来越大,Chrome多开几个网页,也几百M的内存占用。
EF在实际环境中,对查询那些还是很快的,没太注意内存,一般说来压力不大~
@幻天芒: 你说的情况确实如此,虽然我的项目起始100多点最后稳定也是在400以内,对于现在的云主机来说确实不是什么问题,速度也不慢,但是访问量是在几百到1000的情况下,我心里很清楚,如果一旦访问量大增,肯定是不行的。对于一个好的程序,一看初始化的进程占用就心知肚明了,这100多压的我心里喘不过气来,感觉很失败啊,以前我也没注意过w3wp的内存占用,现在每天就死盯,老是优化,但是就是没有效果,无语了,遇到瓶颈了!!
@flyjonson: 如果有大并发,那就发些方式吧(换Orm,或者不用)~,
我想既然NH都能针对大并发,EF应该也会有相应的对策的,只有当出现了,再去针对性优化吧,现在没有具体问题的去优化,感觉效果不大~
@幻天芒: 关键是没有大并发让我尝试啊,不是所有的程序员有机会进入大公司的。撑死也就自娱自乐玩玩负载测试了。
@flyjonson: 我觉得在可接受范围即可(不卡机,不cpu狂涨)!
@幻天芒: 看来得学dudu自己弄个网站,从实践中进步了,否则每天靠想象总不是个事。
@flyjonson: 实践出真知!!!
目前遇到跟楼主类似的情况,网站上线后,内存轻松的上3G以上,而且很快飙升至7G多,服务器快歇菜了。一直怀疑是内存泄露导致的。一番折腾后,目前感觉最大的嫌疑不是说ef映射本身所消耗的内存,而是EF使用不当导致的数据加载到内存中所导致的内存飙升问题。建议楼主谨慎使用EF的相关查询功能,并且熟悉EF的性能优化,否则就是给自己挖坑,还不如回归ADO.net得了,哈哈。下周决定吧自己的项目EF查询优化好好处理下,相信内存很快就会降下来了!
楼主,这个问题你解决了吗?我也遇到相同的问题。