14

背景Entity Frameworkのと並列

私は、定期的なデータダンプ(XMLファイル)を受信し、Entity Frameworkの5(コードファースト)を使用して、既存のデータベースにインポートしたアプリケーションを持っています。エンティティに既に存在するビジネスルールを適用する必要があるため、インポートはBULK INSERTまたはBCPというよりEF5を介して行われます。

処理がアプリケーション自体でCPUにバインドされているように見えます(非常に高速な書き込みキャッシュ対応のディスクIOサブシステムでは、処理中にディスク待機時間がほぼゼロになり、SQL ServerではCPU時間が8%〜10% )。

は、効率を改善するために、私はにコンポーネントをpipeline using 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() 

が、私はこれを行うことにより、パフォーマンスの大幅な増加を見たが、約60%以上のCPUを取得することはできません。

分析

リソース競合のいくつかの並べ替えを疑い、私はVS2012プロファイラのリソース競合データ(同時性)モードを使用してプロセスを実行しました。

プロファイラでは、というラベルの付いたリソースで52%の競合が表示されます。ハンドル2。 )私はハンドル2ための最も競合を作成する方法は、SaveChangesメソッドなど、多くの競合として約40%で2位、(

System.Data.Entity.Internal.InternalContext.SaveChanges() 

であることがわかり、中にドリル、

System.Data.Entity.DbSet`1.Add(!0) 

質問です私は2ハンドルかを把握することができますどのように

  • 本当にれる(E .g。 TPLの一部、EFの一部)?
  • EFは個別のスレッドからDbContextインスタンスを分離するための呼び出しを実行しますか?彼らが争っている共有リソースがあるようです。
  • この場合、並列性を改善するために何かできることはありますか?

当該ラン、12に設定されているSaveChangesメソッドを呼び出すタスクの並列処理の最大程度を

UPDATE(Iは、以前の実行中に無制限含む様々な値を試してみました)。

UPDATE 2

MicrosoftのEFチームはフィードバックを提供してきました。要約については私の答えを見てください。

+1

あなたがプールの接続を待機していませんか?接続プールのサイズを大きくしようとしましたか? – Maess

+0

@Maess:問題の実行については、最大並列度を12に設定しました。正しく理解していれば、接続プールのデフォルトの最大サイズは100です。それでも明示的に高く設定します。 –

+0

@Maess:PerfmonはSQLインスタンスへの11の論理接続と11のユーザー接続のみを示し、接続プールの上限をはるかに下回ります。 –

答えて

5

以下に、この問題に関するEntity Frameworkチームとのやりとりをまとめます。詳細情報が入手可能になると回答を更新します

  • この問題はMicrosoftで再現できます。
  • ハンドルの競合は、ネットワークI/O(ローカルホスト上のSQL Serverを使用している場合でも)に関連しています。具体的には、System.Data.dllにネットワークI/Oの読み取りバッファの競合があります。
  • EFチームは現在、問題をよりよく理解するためにSQL Connectivityチームと協力しています。
  • この競合の影響を最小限に抑える方法については、Microsoftからの指針はまだありません。

UPDATE

この問題は、今のCodePlex上で追跡されている:

http://entityframework.codeplex.com/workitem/636?PendingVoteId=636

+0

ありがとうエリック。私はまったく同じようなシナリオがあるこのcozにかなり興味があります。 connect.microsoft.comに問題があり、その進捗状況を追跡できますか? – Dodd

+0

@Dodd:EFはオープンソースであるため、Codeplexで追跡されています(ただし、Microsoftのチームではまだ動作しています)。リンクが追加されました。 –

関連する問題