Eri*_* J. 14 parallel-processing profiling entity-framework task-parallel-library tpl-dataflow
背景
我有一个应用程序接收定期数据转储(XML文件)并使用Entity Framework 5(代码优先)将它们导入现有数据库.导入通过EF5而不是BULK INSERT或BCP进行,因为必须应用已存在于实体中的业务规则.
处理似乎是应用程序本身的CPU绑定(极快,启用了写缓存的磁盘IO子系统在整个过程中显示几乎为零的磁盘等待时间,而SQL Server显示的CPU时间不超过8%-10%).
为了提高效率,我使用TPL Dataflow构建了一个管道,其组件包括:
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()
Run Code Online (Sandbox Code Playgroud)
通过这样做,我看到性能大幅提升,但不能使CPU高于60%.
分析
怀疑某种资源争用,我使用VS2012 Profiler的资源争用数据(并发)模式运行该过程.
分析器显示52%的争用标记为句柄2的资源.钻进,我看到创建Handle 2最多争用的方法是
System.Data.Entity.Internal.InternalContext.SaveChanges()
Run Code Online (Sandbox Code Playgroud)
第二名,与SaveChanges()的争论大约是40%
System.Data.Entity.DbSet`1.Add(!0)
Run Code Online (Sandbox Code Playgroud)
问题
UPDATE
对于有问题的运行,调用SaveChanges的任务的最大并行度设置为12(我尝试了各种值,包括先前运行中的Unbounded).
更新2
微软的EF团队提供了反馈意见.请参阅我的答案以获取摘要.
以下总结了我在此问题上与实体框架团队的互动.如果有更多信息,我会更新答案
UPDATE
现在正在CodePlex上跟踪此问题:
http://entityframework.codeplex.com/workitem/636?PendingVoteId=636
| 归档时间: |
|
| 查看次数: |
3809 次 |
| 最近记录: |