ASP.NET Core 和 Kestrel 设计决策:他们为什么使用 libuv?
ASP.NET Core and Kestrel design decision: Why do they use libuv?
我刚刚意识到 ASP.NET 核心应用程序不是纯粹的 CLR 应用程序 - 它们总是依赖于额外的二进制库:通过 Kestrel 的 libuv 或者,可能较少使用,http.sys.
我觉得这很令人惊讶,因为我原以为在 .NET Core(以及 .NET Standard)下已经有足够的网络 api 来制作一个性能不错的 Web 服务器,它具有纯粹在 .NET 中的异步 IO - 但他们并没有走那条路。
所以:
- 为什么使用 libuv 可以更快? "Because async IO" 仅此一项还不够,因为 .NET 已经具备了。
- 为什么 Kestrel 没有 运行 在 .NET 的 IO 堆栈之上的选项?在大多数情况下,速度差异并没有那么重要,对吧?
- 性能更好的libuv到底是通过什么样的IO?我认为那只是入站请求。通过
WebClient
、HttpRequest
或 HttpClient
发出的请求不会使用 libuv,对吗?
编辑:
我查看了 Kestrel 源代码,除了一个名为 Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv
的程序集之外,还有一个名为 Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
的程序集。不过,套接字程序集的相应 NuGet 包仅处于预览状态。 (套接字组件当然不依赖于 libuv。)
计划切换到套接字,但它可能无法及时用于 Net Core 2.1,但可以用于 public。
似乎由于性能问题,截至 2017 年 12 月,他们不得不从 Sockets 切换回 Libuv:
我刚刚意识到 ASP.NET 核心应用程序不是纯粹的 CLR 应用程序 - 它们总是依赖于额外的二进制库:通过 Kestrel 的 libuv 或者,可能较少使用,http.sys.
我觉得这很令人惊讶,因为我原以为在 .NET Core(以及 .NET Standard)下已经有足够的网络 api 来制作一个性能不错的 Web 服务器,它具有纯粹在 .NET 中的异步 IO - 但他们并没有走那条路。
所以:
- 为什么使用 libuv 可以更快? "Because async IO" 仅此一项还不够,因为 .NET 已经具备了。
- 为什么 Kestrel 没有 运行 在 .NET 的 IO 堆栈之上的选项?在大多数情况下,速度差异并没有那么重要,对吧?
- 性能更好的libuv到底是通过什么样的IO?我认为那只是入站请求。通过
WebClient
、HttpRequest
或HttpClient
发出的请求不会使用 libuv,对吗?
编辑:
我查看了 Kestrel 源代码,除了一个名为 Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv
的程序集之外,还有一个名为 Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
的程序集。不过,套接字程序集的相应 NuGet 包仅处于预览状态。 (套接字组件当然不依赖于 libuv。)
计划切换到套接字,但它可能无法及时用于 Net Core 2.1,但可以用于 public。
似乎由于性能问题,截至 2017 年 12 月,他们不得不从 Sockets 切换回 Libuv: