Я занимаюсь профилированием службы WCF, использующей EF (System.Data.Entities) для чтения из SQL-кода. Когда я разворачиваю несколько параллельных клиентов, которые попадают в службу, все процессоры идут на 100%, производительность - это, как правило, танки, и все болит.
Профилируя это с помощью профилировщика concurrency, я обнаружил, что 85% времени тратится на синхронизацию, причем фактическое выполнение кода составляет около 4%. Глядя глубже в трассировку стека, большая часть синхронизации, похоже, связана с вызовом WaitForSingleObject в System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync. Стек показывает, что вызов переходит к оболочке нативного метода, а затем завершается в kernel32.dll! _WaitForSingleObject.
Кто-нибудь испытал это раньше? Есть ли способ сделать что-то по этому поводу? Я на самом деле не набрасываю на него абсурдную нагрузку, всего около 20 параллельных клиентов, и все это доступно только для чтения, поэтому я удивляюсь, что нити будут даже синхронизироваться.
Я боролся с этим в течение недели, и я просто не могу это объяснить. Любая помощь будет оценена!