Используют ли методы Entity Framework asyn c потоки ThreadPool? - PullRequest
9 голосов
/ 25 мая 2020

Я обычно использую много EF Core asyn c методов в своем веб-приложении, например:

await db.Parents.FirstOrDefaultAsync(p => p.Id == id);

Как мы знаем, начальное количество потоков в ThreadPool по умолчанию ограничено количеством Логические ядра ЦП. Также запросы пользователей обрабатываются потоками в ThreadPool.

Следует ли мне беспокоиться об обработке пользовательских запросов или проблемах с производительностью из-за большого количества асинхронных c вызовов в моем приложении?

1 Ответ

7 голосов
/ 25 мая 2020

Следует ли мне беспокоиться об обработке пользовательских запросов или проблемах производительности из-за большого количества вызовов asyn c в моем приложении?

EF Core предоставляет интерфейс запросов Asyn c для репозиториев. Независимо от того, является ли это asyn c -all-the-way, или же методы Certian блокируют потоки пула потоков, зависит от поставщика EF. SQLServer SqlClient имеет методы Asyn c на основе задач, которые не блокируют потоки. Большинство других провайдеров тоже. Но, например, для поставщика EF в памяти или, возможно, поставщика SQLite это может быть asyn c -over-syn c, либо завершающееся синхронно и возвращающее завершенную задачу, либо блокирующее поток пула потоков.

Итак, EF обычно не блокирует ваши потоки. А когда вы выполняете Asyn c вызов базы данных, он освобождает поток вашего приложения, чтобы он мог выполнять больше работы. Нравится обрабатывать дополнительные запросы. Если у вас слишком много одновременных запросов к базе данных, каждый запрос начнет занимать больше времени.

Когда это происходит, вам нужен механизм, замедляющий скорость новых запросов к базе данных, иначе вы попадете в плохое состояние. Например, где находится сервер базы данных, выполняется 2000 запросов, большинство из которых отправляются от имени клиентов, которые сдались и истекло время ожидания. И новые запросы не обрабатываются своевременно из-за всех старых запросов.

Обычно пропускная способность увеличивается по мере того, как вы добавляете параллелизм до определенной точки, но после этого общая пропускная способность снижается, иногда резко. Примерно так:

enter image description here

Это зависит от вас, чтобы ограничить общий параллелизм, чтобы предотвратить серьезное снижение пропускной способности. Лучше отклонить некоторые запросы на раннем этапе (например, с HTTP 503), чем принимать их все и не выполнять ни одного в рамках вашего SLA.

Одно из преимуществ использования синхронного доступа к базе данных состоит в том, что он занимает поток приложения для продолжительность взаимодействия с базой данных, автоматически добавляя противодавление к потоку запросов. Наличие запроса, ожидающего потока пула потоков, когда все потоки пула потоков заняты, на самом деле хорошо. Когда вы go all asyn c этот элемент управления исчезает, и вам нужно подумать о его замене.

ASP. NET Ядро в настоящее время не имеет встроенного троттлинга. Хост вашего веб-сервера может иметь некоторые из них, и, например, ограничение пула соединений SqlConnection служит для ограничения количества одновременных запросов на экземпляр приложения. Но у вас должно быть что-то , которое позволяет вам упорядоченно обрабатывать всплеск объема запросов.

...