gpt4 book ai didi

asp.net-core - Kestrel 是否像 Node.js 一样使用单线程处理请求?

转载 作者:行者123 更新时间:2023-12-01 19:01:35 27 4
gpt4 key购买 nike

两者KestrelNode.js基于libuv .

虽然 Node.js 明确指出它使用 an event loop ,我似乎无法找到 Kestrel 是否属于这种情况,或者它是否像 IIS 一样利用线程池/请求队列?

网络服务器后面的 Kestrel

Kestrel behind a web server

Node.js 事件循环

    ┌───────────────────────┐
┌─>│ timers │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ I/O callbacks │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ idle, prepare │
│ └──────────┬────────────┘ ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └──────────┬────────────┘ │ data, etc. │
│ ┌──────────┴────────────┐ └───────────────┘
│ │ check │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
└──┤ close callbacks │
└───────────────────────┘

最佳答案

针对 ASP.Net Core 2.0 进行了更新。正如 poke 所指出的,服务器已分为托管层和传输层,其中 libuv 属于传输层。 libuv ThreadCount已移至其自己的 LibuvTransportOptions它们是在您的网络主机构建器中使用 UseLibuv() 单独设置的扩展方法:

  • 如果您检查 LibuvTransportOptions 在github中的类,你会看到一个ThreadCount选项:

    /// <summary>
    /// The number of libuv I/O threads used to process requests.
    /// </summary>
    /// <remarks>
    /// Defaults to half of <see cref="Environment.ProcessorCount" /> rounded down and clamped between 1 and 16.
    /// </remarks>
    public int ThreadCount { get; set; } = ProcessorThreadCount;
  • 可以在调用 UseLibuv 时设置该选项,在您的网络主机构建器中。例如:

    public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseLibuv(opts => opts.ThreadCount = 4)
    .UseStartup<Startup>()
    .Build();

在 ASP.NET Core 1.X 中,Libuv 配置是 kestrel 服务器的一部分:

  • 如果您检查 KestrelServerOptions 在其 github 存储库中的类中,您将看到有一个 ThreadCount选项:

    /// <summary>
    /// The number of libuv I/O threads used to process requests.
    /// </summary>
    /// <remarks>
    /// Defaults to half of <see cref="Environment.ProcessorCount" /> rounded down and clamped between 1 and 16.
    /// </remarks>
    public int ThreadCount { get; set; } = ProcessorThreadCount;
  • 可以在调用 UseKestrel 时设置该选项,例如在新的 ASP.Net Core 应用程序中:

    public static void Main(string[] args)
    {
    var host = new WebHostBuilder()
    .UseKestrel(opts => opts.ThreadCount = 4)
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

    host.Run();
    }

深入研究源代码:

所以我们可以说它使用多个 libuv eventloops 进行 IO。实际工作是使用 CLR 线程池在具有标准工作线程的托管代码上完成的。

我很想找到更多关于此的权威文档(official docs 没有提供太多细节)。我发现的最好的一个是 Damian Edwards 在 channel 9 上谈论 Kestrel。 。大约第 12 分钟,他解释道:

  • libuv 使用单线程事件循环模型
  • Kestrel 支持多个事件循环
  • Kestrel 在 libuv 事件循环上仅进行 IO 工作
  • 所有非 IO 工作(包括与 HTTP 相关的任何工作,如解析、成帧等)都是在标准 .net 工作线程上的托管代码中完成的。

此外,快速搜索已返回:

  • David Fowler 谈论 Kestrel 中的线程池 here 。它还确认请求仍可能在 ASP.Net Core 中的线程之间跳转。 (与以前的版本一样)
  • 这个blogpost看到 Kestrel 出来的时候
  • 这个question关于如何在 ASP.Net Core 中管理线程。

关于asp.net-core - Kestrel 是否像 Node.js 一样使用单线程处理请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40948857/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com