背景
我有一个接收周期数据转储(XML文件),然后导入到使用实体框架5(代码优先)现有数据库的应用程序。 进口通过EF5而不是说BULK INSERT或BCP是因为已经在实体存在的业务规则必须应用。
处理似乎是CPU在应用程序本身的约束(的速度极快,写高速缓存启用磁盘IO子系统显示整个过程几乎为零盘等待时间,和SQL Server显示不超过8%-10%的CPU时间)。
为了提高效率,我建了一个使用TPL数据流管道与组件:
Read & Parse XML file
|
V
Create entities from XML Node
|
V
Batch entities (BatchBlock, currently n=200)
|
V
Create new DbContext / insert batched entities / ctx.SaveChanges()
我看到这样的性能大幅提高,但不能得到上述约60%的CPU。
分析
怀疑某种资源争用的,我跑使用VS2012 Profiler的资源争用数据(并发)模式的过程。
探查表明了我52%争标手柄2的资源。 钻井,我看到2手柄打造最争的方法是
System.Data.Entity.Internal.InternalContext.SaveChanges()
排在第二位,在40%左右为许多争论的SaveChanges为(),是
System.Data.Entity.DbSet`1.Add(!0)
问题
- 我怎样才能找出手柄2真的是(如第三方物流的一部分,EF的一部分)?
- 请问EF油门调用的DbContext实例从单独的线程分开? 似乎有他们竞争共享资源。
- 有什么我可以做些什么来改善这种情况下并行?
UPDATE
对于有问题的运行,为调用的SaveChanges设置为12任务的最大并行度(我尝试过各种价值观,包括在以前运行无界)。
更新2
微软的EF团队提供反馈。 看到我的总结答案。