Entity Framework 异步方法是否使用 ThreadPool 线程?
Do Entity Framework async methods consume ThreadPool threads?
我通常在我的 Web 应用程序中使用许多 EF Core
异步方法,如下所示:
await db.Parents.FirstOrDefaultAsync(p => p.Id == id);
我们知道,ThreadPool
中的初始线程数默认限制为 CPU 逻辑核心数。此外,用户请求由 ThreadPool
中的线程处理。
由于我的应用程序中有许多异步调用,我是否应该担心处理用户请求或性能问题?
Should I worry about handling user requests or performance issues due to many async calls in my application?
EF Core 为存储库提供异步查询接口。无论是完全异步,还是 certian 方法是否阻塞线程池线程,都取决于 EF 提供程序。 SQLServer 的 SqlClient 具有不阻塞线程的基于任务的异步方法。大多数其他提供商也这样做。但是例如对于 EF 内存中提供程序,或者可能是 SQLite 提供程序,它可能是异步同步,同步完成并返回已完成的任务,或者阻塞线程池线程。
所以 EF 通常不会阻塞您的线程。当您对数据库进行异步调用时,它会释放您的应用程序的线程来做更多的工作。喜欢处理额外的请求。如果对数据库的并发请求太多,每个请求将开始花费更多时间。
发生这种情况时,您需要有一种机制来减慢对数据库的新请求的速率,否则您将进入糟糕的状态。数据库服务器所在的 EG 有 2000 运行 个请求,其中大部分代表已经放弃并超时的客户端。由于所有旧请求,新请求无法及时处理。
通常,当您将并发添加到某个点时,吞吐量会增加,但超过该点后,整体吞吐量会下降,有时会急剧下降。像这样:
您可以限制整体并发以防止吞吐量严重下降。尽早让一些请求失败(例如使用 HTTP 503)比接受所有请求而不在您的 SLA 内完成任何请求要好。
使用同步数据库访问的好处之一是它在数据库交互期间占用一个应用程序线程,自动向请求流添加背压。当所有线程池线程都忙时,请求必须等待线程池线程实际上是一件好事。当你全部异步时,这个控件就会消失,你需要考虑替换它。
ASP.NET Core 目前没有内置节流。您的 Web 服务器主机可能有一些,例如,SqlConnection 的连接池限制用于限制每个应用程序实例的并发请求数。但是您必须 一些东西 可以让您以有序的方式处理请求量的激增。
我通常在我的 Web 应用程序中使用许多 EF Core
异步方法,如下所示:
await db.Parents.FirstOrDefaultAsync(p => p.Id == id);
我们知道,ThreadPool
中的初始线程数默认限制为 CPU 逻辑核心数。此外,用户请求由 ThreadPool
中的线程处理。
由于我的应用程序中有许多异步调用,我是否应该担心处理用户请求或性能问题?
Should I worry about handling user requests or performance issues due to many async calls in my application?
EF Core 为存储库提供异步查询接口。无论是完全异步,还是 certian 方法是否阻塞线程池线程,都取决于 EF 提供程序。 SQLServer 的 SqlClient 具有不阻塞线程的基于任务的异步方法。大多数其他提供商也这样做。但是例如对于 EF 内存中提供程序,或者可能是 SQLite 提供程序,它可能是异步同步,同步完成并返回已完成的任务,或者阻塞线程池线程。
所以 EF 通常不会阻塞您的线程。当您对数据库进行异步调用时,它会释放您的应用程序的线程来做更多的工作。喜欢处理额外的请求。如果对数据库的并发请求太多,每个请求将开始花费更多时间。
发生这种情况时,您需要有一种机制来减慢对数据库的新请求的速率,否则您将进入糟糕的状态。数据库服务器所在的 EG 有 2000 运行 个请求,其中大部分代表已经放弃并超时的客户端。由于所有旧请求,新请求无法及时处理。
通常,当您将并发添加到某个点时,吞吐量会增加,但超过该点后,整体吞吐量会下降,有时会急剧下降。像这样:
您可以限制整体并发以防止吞吐量严重下降。尽早让一些请求失败(例如使用 HTTP 503)比接受所有请求而不在您的 SLA 内完成任何请求要好。
使用同步数据库访问的好处之一是它在数据库交互期间占用一个应用程序线程,自动向请求流添加背压。当所有线程池线程都忙时,请求必须等待线程池线程实际上是一件好事。当你全部异步时,这个控件就会消失,你需要考虑替换它。
ASP.NET Core 目前没有内置节流。您的 Web 服务器主机可能有一些,例如,SqlConnection 的连接池限制用于限制每个应用程序实例的并发请求数。但是您必须 一些东西 可以让您以有序的方式处理请求量的激增。