不,答案我的第二个问题是不是冬天。
前言:
我已经做了很多关于实体框架最近研究的东西,一直困扰我的是它的性能,当查询不预热,所谓的冷查询。
我经历了去了性能方面的考虑文章的实体框架5.0。 作者介绍了温 , 冷查询,以及他们如何不同,这我也注意到自己不知道他们的存在的概念。 这可能是值得一提的我只有六个月在我背后的经验。
现在我知道什么话题我可以研究到另外如果我想更好地了解架构在性能方面。 不幸的是大多数的互联网上的信息是过时或臃肿的主观性,因此,我无法找到在温暖的任何其他信息VS 冷查询话题。
基本上,到目前为止,我已经注意到的是,每当我必须重新编译或回收命中,我最初的查询变得很慢。 读取任何后续数据快( 主观 ),符合市场预期。
我们将迁移到Windows Server 2012中,IIS8和SQL Server 2012作为一个少年我居然赢了自己的机会,其余部分之前对它们进行测试。 我很高兴他们推出了预热模块,将让我的应用程序准备好了第一个请求。 但是,我不知道如何与热身我的实体框架进行。
我已经知道是值得做的事情:
- 生成我提前观的建议。
- 最后,移动我的模型到一个单独的组件。
我认为这样做,用常识, 可能是错误的做法会:
- 做虚拟数据,以温暖的事情了,生成和验证模式,在应用程序启动读取。
问题:
- 什么是具有高可用性对我的实体框架在任何时候,最好的办法?
- 在什么情况下不实体框架变“冷”了? (重新编译,回收,重新启动IIS等)
- 什么是具有高可用性对我的实体框架在任何时候,最好的办法?
你可以去预生成的意见和静态编译查询的混合。
静态CompiledQuerys因为他们是快速和容易写,并帮助提高性能都不错。 然而,随着EF5无需编译,因为EF您所有的疑问都会自动编译查询本身。 唯一的问题是,当缓存被横扫这些查询可能会丢失。 所以你还是要坚持对那些只发生非常罕见自己编译的查询引用,但价格昂贵。 如果你把这些查询到要首先需要他们的时候,他们会被编译静态类。 这可能是一些查询为时已晚,所以你可以在应用程序启动强制这些查询的编译。
预生成的观点是你提到的另一种可能性。 特别是对于那些需要很长的编译和不会改变的查询。 这样,你从运行时移动性能开销编译时间。 这也将不会引入任何滞后。 但是,当然,这种变化经历到数据库中,所以它不是那么容易对付。 代码更加灵活。
不要使用大量的TPT的继承(这是在EF一般的性能问题)。 无论是建立自己的继承层次过深,也不能太宽。 只有2-3特定于某个类的属性可能不足以需要一个自己的类型,但作为可选(可为空)属性现有类型能够处理。
不要抱上很长一段时间的单一环境。 每个上下文实例都有自己的一级缓存这会降低性能,因为它变大。 上下文的创建是便宜,但环境的缓存的实体内的状态管理可能变得昂贵。 其它高速缓存(查询计划和元数据)的上下文之间共享,并且将与应用程序域一起死亡。
总而言之,你应该确保经常分配情况和使用它们只有很短的时间,你可以快速启动应用程序,您编译很少使用的查询,对于那些性能是至关重要的,经常使用的查询提供预先生成的意见。
- 在什么情况下不实体框架变“冷”了? (重新编译,回收,重新启动IIS等)
基本上,每次你失去了你的AppDomain。 IIS执行重新启动每29小时 ,这样你就可以永远保证你必须在你的实例。 另外一段时间内没有活动的AppDomain也关机。 你应该尝试拿出再次快速。 也许你可以做一些初始化异步的(但多线程问题要小心)。 您可以使用过程中的时代呼唤你的应用程序虚拟网页时,有没有要求,以防止在AppDomain从垂死的计划任务,但最终会。
我还假设当你改变你的配置文件或更改那里将是一个重新开始的组件。
如果您正在寻找所有来电最高性能您应该谨慎考虑您的架构。 例如,它可能是有意义的预缓存经常被用来查找UPS在服务器RAM当应用程序负载了,而不是使用的数据库在每次请求调用。 这种技术将确保常用数据最小应用程序响应时间。 但是,你必须确保有一个良好的表现到期策略或经常清除缓存每当更改后会影响缓存的数据,以避免并发问题它。
在一般情况下,你要努力分布式体系结构设计时在本地缓存的信息变得陈旧,或者需要交易只需要基于IO数据请求。 任何“过线”的数据请求通常会需要更长的时间10-1000倍取回比本地,在内存中缓存检索。 这一个事实就往往使得有关“冷与暖数据”相比,“本地与远程”数据问题无关紧要的讨论。
一般的提示。
- 执行严格的记录,包括什么是访问和请求时间 。
- 初始化您的应用程序,你从前面的步骤拿起暖开机很慢请求时执行虚拟请求。
- 不要打扰优化,除非它是一个真正的问题,与应用程序的消费者沟通,并要求。 获得舒适的具有连续反馈回路如果只是要弄清楚什么需要优化 。
现在解释为什么假的请求都没有错误的做法 。
- 更低的复杂性 -您正在升温的方式,无论在框架的变化,将工作中的应用,而你并不需要弄清楚可能时髦的API /框架内部做正确的方式 。
- 更大的覆盖范围 -您正在升温,在一次相关的慢则请求高速缓存的所有层。
为了解释当高速缓存变“冷”。
这发生在你的框架 ,适用于高速缓存的任何一层 ,还有在一个很好的说明性能页面的顶部 。
- 当以往任何时候都具有高速缓存,使缓存失效的潜在改变后进行验证,这可能是一个超时或更聪明(在缓存项,即变化)。
- 当缓存项被驱逐时,该算法这样在节“Cache驱逐算法”中描述您链接性能的文章 ,但在短。
- LFRU(最频繁 - 最近使用过的)上命中次数和年龄缓存800项的限制。
你提到的其他事情,特别是重新编译和IIS明确要么重启部分或全部的缓存在内存中。
正如你所说的,使用这真的所有你需要做的“预生成的意见”。
从提取的链接 :“当生成的观点,他们也证实从性能的角度来看,绝大多数的观点发电的成本实际上是意见的验证。”
这意味着当你建立你的模型装配性能敲就会发生。 然后,您的上下文对象将跳过“冷查询”,并保持响应的上下文对象的生命周期的持续时间以及后续的新对象的上下文。
执行不相关的查询会并没有别的目的,而不是消耗系统资源。
快捷...
- 跳过预先生成视图所有这些额外的工作
- 创建对象上下文
- 关火那甜甜的查询无关
- 然后自顾自地为您处理的时间您的对象上下文的引用(不推荐)。
我在这个框架没有经验。 但在其他情况下,如Solr的,完全虚读不会有太大的用处,除非你可以缓存整个数据库(或指数)。
更好的方法是登录查询,提取最常见的出来的日志,并利用它们来热身。 只要确保不记录热身查询或继续之前从日志中删除。