Entity Framework и Parallelism
Фон
У меня есть приложение, которое получает периодические дампы данных (файлы XML) и импортирует их в существующую базу данных с использованием Entity Framework 5 (Code First). Импорт происходит через EF5, а не BULK INSERT или BCP, потому что необходимо применять бизнес-правила, которые уже существуют в объектах.
Обработка, по-видимому, связана с ЦП в самом приложении (очень быстро, подсистема ввода-вывода с включенным доступом к записи-кэша показывает почти нулевое время ожидания диска на протяжении всего процесса, а SQL Server показывает не более 8% -10% процессорного времени).
Чтобы повысить эффективность, я построил конвейер
System.Data.Entity.Internal.InternalContext.SaveChanges()
Второе место, примерно на 40%, столько же, сколько SaveChanges(),
System.Data.Entity.DbSet`1.Add(!0)
Вопросы
Как я могу понять, что такое Handle 2 (например, часть TPL, часть EF)?
Запускает ли EF дроссель для разделения экземпляров DbContext из отдельных потоков? Кажется, есть общий ресурс, за который они борются.
Есть ли что-нибудь, что я могу сделать, чтобы улучшить parallelism в этом случае?
UPDATE
Для рассматриваемого прогона максимальная степень parallelism для задачи, вызывающая SaveChanges, равна 12 (я пробовал различные значения, включая Unbounded в предыдущих прогонах).
ОБНОВЛЕНИЕ 2
Команда Microsoft EF предоставила отзывы. См. Мой ответ для резюме.
Ответы
Ответ 1
Ниже представлено мое взаимодействие с командой Entity Framework по этой проблеме. Я обновлю ответ, если появится больше информации
- Проблема может быть воспроизведена в Microsoft.
- Конфликт дескрипторов связан с сетевым вводом-выводом (даже с SQL Server на локальном хосте). Конкретно, есть конкуренция для буфера чтения для сетевого ввода-вывода в System.Data.dll.
- Команда EF теперь работает с командой SQL Connectivity, чтобы лучше понять проблему.
- До сих пор нет руководства от Microsoft о том, как минимизировать влияние этого утверждения.
UPDATE
Эта проблема теперь отслеживается в CodePlex:
http://entityframework.codeplex.com/workitem/636?PendingVoteId=636