最近开发的服务放到IIS上寄宿之后,遇到一些现象,比如刚部署之后,第一次启动很慢;程序放置一会儿,再次请求也会比较慢。比如第一个问题,可以解释为初次请求某一个服务的时候,需要把程序集加载到内存中可能比较慢,第二个问题有可能是IIS的线程回收机制导致放置若干长时间,空闲的进程被回收了,再次请求的话可能比较慢。

刚开始的时候没有太在意,但是随着系统的发布,这种初次请求,或者闲置若干时间后第一次请求的漫长等待使得App的体验很差,很多时候App加载好半天数据都没过来。如果前端没处理好,还会导致App的假死。所以就花了点功夫研究下什么原因导致。

刚开始的时候,还以为是WebService的框架出了问题。后面使用App,通过Fiddler看到了,某次请求db.竟然长达6s中,并且每次导致请求超时都出现在db.访问这一块,这显然不正常。早期,我们访问数据库使用的是原始的ADO.NET 执行SQL语句,如果有参数的话,参数化防止SQL注入,然后基本的增删查,通过批量生成存储过程实现,并在底层框架层记录了每次服务的访问语句和次数,这样便于调优。起初认为这样性能是坠吼的,但是随着规模的扩大,效率太低,所以就切换到了Entity Framework上,通过自动生成实体,然后通过LINQ的方式来实现增删改查,这样效率快很多。

意识到是数据访问的问题之后,开始在查找Entity Framework第一次启动比较慢的问题,然后在网上找了一下,发现很多人都遇到过同样的问题。解决方案也比较成熟,比如Pre-Generated Mapping Views,NGen等等,下面就逐个来说明,其实这些在网上也有很多,我这里记录一下作为自己以后备查。

一、Entity Framework初次启动优化

下面提到的方法,有很多需要Entity Framework版本的支持,所以我们在使用Entity Framework的时候,最好使用最新版本。

Pre-Generated Mapping Views

关于使用EntityFramework的注意事项在Performance Considerations for Entity Framework 这篇文章中有详细介绍,其中生成视图操作耗时比较多,在Entity Framework执行查询或者对数据库进行写操作的时候,必须生成一些映射视图来访问数据库,这些映射视图是一系列对数据库中对象的抽象声明,这些数据同时也是app domain的缓存元数据的一部分,在同一应用程序作用域里面,创建多个数据库访问上下文时可以重用这部分对象。因为在第一次查询的时候,生成映射视图是比较耗时的,所以关于这一点,具体的详细操作可以查看msdn上的Pre-Generated Mapping Views,这篇文章提供了两种预先生成映射视图的方法,一种是在Visual Studio中,通过安装EF Power Tools 插件来生成(以下图片,来自msdn)。

这种方式不受EF的版本限制。

网站还提供了第二种通过代码的方式来预先生成视图,这必须要求EF是6.0及以上版本。这也是博客园这篇文章 来,给Entity Framework热热身所使用的方法。一般的,如果是Web站点,可以放在App_Start中来初始化:

protected void Application_Start(object sender, EventArgs e)
{//预热EntityFrameworkusing (var dbcontext = new mcccEntities()){var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);mappingCollection.GenerateViews(new List<EdmSchemaError>());}
}

经过以上处理,大概程序初次查询db从之前的6s下降到了3s左右。

除了以上优化之外,对于EF6.0及之后的版本,可以使用NGen处理来进一步提高速度。

二、NGen优化

相关优化可以查看这篇文章Improving Startup Performance with NGen (EF6 Onwards),下面这条方法,主要是针对EF6及以上版本的,因为低于这个版本的自带该特性,在这篇文章里说的很清楚“在6.0之前的EF中,EF的运行时核心类库也是.NET框架的一部分,其本地映像在.NET 核心类库加载时自动加载,在6.0及之后的版本,EF整个运行时已经被集成到EntityFramework NuGet包中,本地映像需要使用NGen工具来生成才能达到类似的效果”。

提到这里,首先要说一下NGen这个工具的作用以及为什么能够加快应用程序的启动性能。.NET 框架支持为托管应用或者程序集生成本地映像文件来帮助应用程序更快启动和在一些情况下减少内存占用。在应用程序执行之前,通过将托管代码程序集翻译为包含本地机器指令的文件,能够减少.NET JIT编译器在应用程序启动的时候,生成本地指令代码这一过程,从而能够加快应用程序启动。

使用NGen也很简单

1:以管理员身份启动控制台cmd程序

2:切换到本机.NET 工具目录下:

对于32位机器,通常在%WINDIR%\Microsoft.NET\Framework\v4.0.30319\下

对于64位机器,通常在 %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\下

3:然后执行 ngen install 加上程序集的路径和名称,即可。

比如在我的机器上,可以看到如下:

经过这一操作,首次访问db的速度终于控制到了500ms以内。

以上是EF的优化,解决了首次部署之后,第一次访问数据库的问题,对于应用程序放置一会儿,再次请求由于线程池回收导致再次访问变慢的问题,通过设置IIS解决。

三、IIS设置

将服务或者站点部署到IIS上之后,在对应的线程池里有两个地方可以设置,如下图:

  • 空闲超时时间,默认是20分钟,表示在20分钟之类,如果没有请求进来,那么对应的线程就处于闲置状态,这里将其改为0。
  • 例常(Regular)回收时间,这里默认为1740分钟,大概是29个小时(为什么是29而不是24,据说是为了将回收时间的影响减小到最小化,方便调试找到问题,29是24以后的第一个质数),表示大概每隔29个小时,IIS会回收一次应用程序线程池里面的线程。

这样设置之后就可以解决第二个问题。

四、总结

本文简单介绍了优化EntityFramework初次启动速度的方法,以及为防止IIS线程超时闲置,以及例常线程回收导致的初次运行时间过长的解决方法,希望对您解决上述问题有所帮助。

转载于:https://www.cnblogs.com/yangecnu/p/Speed-First-Startup-of-the-Entity-Framework.html

Entity Framework的启动速度优化相关推荐

  1. 彻底征服 Entity Framework Core 优化!

    作者 | 喵叔 责编 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 这篇文章我们来讲解一下 Entity Framework Core 的优化方案.Entity Framework Cor ...

  2. Entity Framework 数据并发访问错误原因分析与系统架构优化

    本文主要记录近两天针对项目发生的数据访问问题的分析研究过程与系统架构优化,我喜欢说通俗的白话,高手轻拍 1. 发现问题 系统新模块上线后,使用频率较高,故在实际使用和后期的问题重现测试中,产生了一下系 ...

  3. Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  4. Entity Framework 4.1/4.3 之五 (DBContext 之 2 查询功能)

    Entity Framework 4.1/4.3 之五 (DBContext 之 2 查询功能) 昨天我们讲了 DBContext的作用及它的一些相对于ObjectContext进行的优化,今天继续进 ...

  5. Entity Framework Core 2.0 使用入门

    本文转载自作者:晓晨Master(李志强) 原文章地址 https://www.cnblogs.com/stulzq/p/7717873.html 一.前言 Entity Framework(后面简称 ...

  6. ADO.net,Linq to SQL和Entity Framework性能实测分析

    [测试总结] 第一阶段测试结果非常出人意料,ADO.net和LINQ to SQL操作数据的时间都控制在0.5秒以内,非常的迅速,但是Entity Framework在添加这步表现非常差,由于这五步是 ...

  7. Entity Framework 实体框架的形成之旅--实体数据模型 (EDM)的处理(4)

    在前面几篇关于Entity Framework 实体框架的介绍里面,已经逐步对整个框架进行了一步步的演化,以期达到统一.高效.可重用性等目的,本文继续探讨基于泛型的仓储模式实体框架方面的改进优化,使我 ...

  8. Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)

    很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...

  9. 第一篇:Entity Framework 简介

    先从ORM说起吧,很多年前,由于.NET的开源组件不像现在这样发达,更别说一个开源的ORM框架,出于项目需要,以及当时OOP兴起(总不至于,在项目里面全是SQL语句),就自己开始写ORM框架.要开发O ...

最新文章

  1. pythonexcel汇总_用python汇总excel表格数据-怎样用python遍历表格中的内容
  2. 基于thrift的微服务框架
  3. Sublime Text Version 3.0,Build3143注册码
  4. Go之十大经典排序算法
  5. html sql注入_Web安全-SQL注入(sqli-lab)
  6. java 字符串赋值_灵魂拷问:为什么 Java 字符串是不可变的?
  7. Liunx中EOF的用法
  8. perl xml dom中文乱码问题解决
  9. 三星笔记本进入BIOS后找不到U盘启动项/快速启动键F12没有反应
  10. HashMap 实现原理及源码解析(jdk8 底层⽤的是数组+链表/红⿊树)
  11. html表格的系列代码,HTML系列(八):表格(示例代码)
  12. 51CTO独家:2008下半年软考所有科目试题已到
  13. LayaAir Sprite 旋转缩放
  14. Android 四大组件学习之Activity二
  15. 【昊鼎王五】Windows的Git客户端安装步骤
  16. 继电保护原理5-变压器保护
  17. 苹果公司:苹果商店App价格将调整 多个国家地区受影响
  18. 笔记整理--玩转robots协议
  19. 基因编辑最新研究成果进展(2021年11月)
  20. DDD(Domain-Driven Design)领域驱动架构介绍

热门文章

  1. windows 2008 R2无法创建性能收集器
  2. WordPress首页调用QQ签名
  3. Web架构师必备能力
  4. 线性时间选择问题——分治
  5. SAP事务码f-02做账界面显示“页数”字段
  6. 完成工作表-使用Google Spreadsheets作为数据后端
  7. MySQL宽字节注入漏洞分析_宽字节注入
  8. PAT(甲级)2020年秋季考试 7-4 Professional Ability Test
  9. C++ 枚举类型基本知识
  10. 【转】Visual Studio团队资源管理器 Git 源码管理工具简单入门