如何为低延迟配置asp.net茶??

时间:2019-01-09 04:38:52

标签: c# linux .net-core low-latency kestrel

我正在尝试实现一个asp.net 2.2应用程序,以尽可能低的延迟(不是吞吐量,它不是用于生产,而是某种竞争)来服务HTTP请求。该应用程序应该在具有4个内核的Linux docker容器环境中运行,我的处理程序的CPU绑定时间为0.2..3 ms。连接是预先创建的并保持活动状态,但是我目前对空处理程序的处理时间约为0.6..0.8 ms(以200 OK答复),具有明显的抖动和偶发的20-50 ms峰值,我无法解释。

Kestrel / Sockets / Threads / CLR是否有任何特定设置可以帮助最小化每个请求的响应时间?还是要用EPOLL进行C / C ++路由是我唯一的选择,如果我想将其降低到0.1..0.2 ms?

2 个答案:

答案 0 :(得分:3)

  

使用ASP.NET Core / Kestrel当然可以实现低延迟。

这是一个小型的Web应用程序,用于演示这一点...

using System.Net;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;

public static void Main(string[] args)
{
    IWebHost host = new WebHostBuilder()
        .UseKestrel()
        .Configure(app =>
        {
            // notice how we don't have app.UseMvc()?
            app.Map("/hello", SayHello);  // <-- ex: "http://localhost/hello"
        })
        .Build();

    host.Run();
}

private static void SayHello(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        // implement your own response
        await context.Response.WriteAsync("Hello World!");
    });
}

herehere之前,我已经回答了很多类似的问题。

  

如果您想将ASP.NET Core框架与其他框架进行比较,这是一个很棒的外观https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext。如您所见,ASP.NET Core取得了非凡的成绩,并且是C#的领先框架。

在上面的代码块中,我注意到缺少app.UseMvc()。如果您确实需要它,我在此答案中做了一个非常详细的答案,以获得更好的延迟:What is the difference between AddMvc() and AddMvcCore()?


.NET Core运行时(CoreRT)

如果您仍然需要更高的性能,我建议您看看.Net Core Runtime (CoreRT)

请注意,在撰写本文时,可能需要更详细地审查此选项,然后才能将其用于生产系统。

  

“ CoreRT带来了本机编译的大部分性能和所有部署优势,同时保留了使用自己喜欢的.NET编程语言编写的能力。”

CoreRT提供了许多应用程序都至关重要的巨大优势。

  • 本机编译器生成单个文件,包括应用程序,托管依赖项和CoreRT。
  • 本机编译的应用程序执行已编译的代码,因此启动速度更快。他们不需要在运行时生成机器代码,也不需要加载JIT编译器。
  • 本地编译的应用程序可以使用优化的编译器,从而可以从更高质量的代码(C ++编译器优化)中获得更快的吞吐量。 LLILLC和IL至CPP编译器都依赖于优化编译器。

这些好处为.NET开发人员打开了一些新的场景

  • 从一台计算机复制单个文件可执行文件,然后在另一台(相同类型的)计算机上运行,​​而无需安装.NET运行时。
  • 创建并运行一个包含单个文件可执行文件的docker映像(例如,除了Ubuntu 14.04之外还包含一个文件)。

特定于Linux的优化

有一个不错的库,它试图处理非常特殊的情况。特别是对于Linux(但此代码对其他操作系统是安全的)。此优化背后的原理是用另一种特定于Linux的优化替换libuv传输库(ASP.NET Core使用)。

它直接使用内核原语来实现Transport API。这减少了堆分配的对象(例如uv_buf_tSocketAsyncEventArgs)的数量,这意味着GC压力较小。建立在xplat API之上的实现将汇集对象以实现此目的。

using RedHat.AspNetCore.Server.Kestrel.Transport.Linux; // <--- note this !

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseLinuxTransport()     // <--- and note this !!!
        .UseStartup()
        .Build();

// note: It's safe to call UseLinuxTransport on non-Linux platforms, it will no-op
  

您可以在https://github.com/redhat-developer/kestrel-linux-transport

上查看GitHub上该中间件的存储库。

enter image description here

enter image description here

来源:https://developers.redhat.com/blog/2018/07/24/improv-net-core-kestrel-performance-linux/

答案 1 :(得分:1)

感谢所有回答的人。我最终使用epoll_wait()系统调用实现了自己的HTTP服务器,这是将延迟降低到所需水平的唯一方法。 Kestrel提供了大约2-2.5倍的延迟。

请记住,Kestrel仍然是满足大多数生产需求的绝佳选择,它针对具有合理延迟的最大吞吐量进行了优化。