设为首页 收藏本站
查看: 1825|回复: 0

[经验分享] MVC5中EF6 Code First启动慢及间隙变慢优化的实践经验(转)

[复制链接]

尚未签到

发表于 2017-12-29 12:24:55 | 显示全部楼层 |阅读模式
  MVC的程序第一次访问比较慢的的问题由于第一次是要处理视图文件.cshtml(生成为.cs文件)、加载引用的dll程序文件和初始化程序池等等。
第二、优化方案
我主要是通过以下几方面来优化一、安装Application Initialization
  这是在iis8出来后才有的,iis8内置的功能,而对于iis7.5也提供了一个扩展以支持这个功能。
  Application Initialization Module for IIS 7.5
  在页面接近底部的地方,找到适合自己架构的安装链接

  • x86 for Windows 7
  • x64 for Windows 7 or Windows Server 2008 R2
  安装这个iis模块后,在iis界面中并没有模块图标和配置界面,还需要安装:
  http://pan.baidu.com/s/1c091WxM
  安装成功之后会多了一个配置如下图:
DSC0000.gif

  如果仅配置程序池StartMode为AlwaysRunning还不放心的话,
  也可以同时针对站点开启preload和DoAppInitAfterRestart。
  设置应用程序池如下图:
DSC0001.gif

  设置网站如下图
DSC0002.gif

  配置好后,测试了下,效果十分不错。
  回收程序池后首次打开各站点,延迟都很低。
  其实这个模块的思路和定时从外部触发一个访问是一样的,只是,更好的地方在于,它本身在程序池回收重启的时候就完成了这件事,而不会让外部访问有机会遇到首次访问的情况。
二、用Ngen安装生成EF的本地镜像
1、打开cmd窗口2、定位到dll所在的目录,如:cd d:\website1\bin,切换到程序的bin目录。3、运行ngen命令For 32 bit run:%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install EntityFramework.SqlServer.dll  For 64 bit run:
  %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install EntityFramework.SqlServer.dll
注意:这里根据你自己机器(是32还是64)和.net版本,选择相应的命令,只需要安装EntityFramework.SqlServer.dll,因为安依赖EntityFramework.dll,会自动安装生成EntityFramework.dll的本地镜像。三、禁用第一次ef查询对表__MigrationHistory的问题
  使用了ef的Code first会在第一次ef查询的时候会对__MigrationHistory访问,是为了检查数据库和model是否匹配,以保证ef能正常运行。通过监测会先执行下面的sql:

  • SELECT
  • [GroupBy1].[A1] AS [C1]
  • FROM ( SELECT
  •     COUNT(1) AS [A1]
  •     FROM [dbo].[__MigrationHistory] AS [Extent1]
  • )  AS [GroupBy1]
  • GO

  • SELECT TOP (1)
  • [Extent1].[Id] AS [Id],
  • [Extent1].[ModelHash] AS [ModelHash]
  • FROM [dbo].[EdmMetadata] AS [Extent1]
  • ORDER BY [Extent1].[Id] DESC
  • GO
这段sql语句其实中只是在开发的时候有用,发布到生产环境,可以把这个给禁用了以提高性能。解决办法:Application_Start加代码

  • Database.SetInitializer<lanhuBlog.DAL.BlogContext>(null);
lanhuBlog.DAL.BlogContext这是我项目的EF上下方类,你要根据你的项目替换成自己的EF上下方类。 四、Model和DAl单独的分层的
用vs建一个mvc项目,Model、DAL、Controller、View都在Web项目里面。为了减少model和DAL导致重新编译dll带来的性能影响。我把Model和DAL都单独的分层,编译成单独的dll了。 五、EF Pre-Generated Mapping Views(预生成映射视图)
Application_Start加入下面代码:

  • using (var dbcontext = new EFDbContext())
  • {
  • var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;
  • var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
  • mappingCollection.GenerateViews(new List<EdmSchemaError>());
  • //对程序中定义的所有DbContext逐一进行这个操作
  • }
六、补充
  如果你觉得这还没有解决”过了一段时间不访问页面然后再次打开页面变慢“的问题,而且不能忍受第一次访问还是有点慢,可以设置应用程序池的”闲时超时“和回收”固定时间间隔“长一些或者建一个计划任务定时去访问使用了ef的页面,这样给ef热身,让ef不变冷,这样可以防止长时间不请求网站,应用程序进程停止再次访问变慢的问题。设置应用程序池的时间如下图:
DSC0003.gif

  闲时超时默认是20分钟,如果在超过20分钟都没有请求这个应用程序池工作进程就要关闭。这里你可以设置根据自己需要设置长一些。
  转自:http://www.lanhusoft.com/Article/127.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429321-1-1.html 上篇帖子: java对图片进行操作,仅仅是小demo 下篇帖子: 在IIS7.5上配置Https,SSL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表