【问题标题】:ASP.NET Core and Kestrel design decision: Why do they use libuv?ASP.NET Core 和 Kestrel 设计决策:他们为什么使用 libuv?
【发布时间】:2018-02-01 08:56:28
【问题描述】:

我刚刚意识到 ASP.NET Core 应用程序不是纯粹的 CLR 应用程序 - 它们总是依赖于额外的二进制库:通过 Kestrel 的 libuv 或者可能较少使用的 http.sys。

我觉得这很令人惊讶,因为我原以为 .NET Core(以及 .NET Standard)下已经有足够的网络 api,可以在 .NET 中创建一个性能不错的具有异步 IO 的 Web 服务器 - 但他们没有走那条路。

所以:

  • 为什么使用 libuv 会更快? “因为异步 IO”本身并不能说明一切,因为 .NET 已经具备了这一点。
  • 为什么 Kestrel 没有在 .NET 的 IO 堆栈上运行的选项?在大多数情况下,速度差异并没有那么重要,对吧?
  • 究竟什么样的 IO 会通过性能更好的 libuv?我认为这只是入站请求。通过WebClientHttpRequestHttpClient 发出的请求不会使用 libuv,对吗?

编辑:

我查看了 Kestrel 的源代码,除了一个名为 Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv 的程序集之外,还有一个名为 Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets 的程序集。套接字程序集的相应 NuGet 包仅处于预览状态。 (当然,sockets 组件不依赖于 libuv。)

【问题讨论】:

    标签: asp.net-core kestrel-http-server


    【解决方案1】:

    计划是切换到 Sockets,但它可能无法及时用于 Net Core 2.1,但可以向公众提供。

    似乎从 2017 年 12 月起,由于性能问题,他们不得不从 Sockets 切换回 Libuv:

    https://github.com/aspnet/KestrelHttpServer/issues/2220

    【讨论】:

    • 更新:他们毕竟在 2.1 中切换到了 Sockets,将 Libuv 保留为外部包以实现向后兼容性。它在 .Net 5 中被弃用并在 6 中被删除。Source
    • 它实际上已在 .NET 7 中被删除。见github.com/dotnet/aspnetcore/issues/38022
    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2018-03-02
    • 2017-07-08
    • 2011-03-04
    相关资源
    最近更新 更多