c# – 如何配置asp.net kestrel以实现低延迟?

我正在尝试实现一个asp.net 2.2应用程序,以尽可能低的延迟(不是吞吐量,不是生产而是某种竞争)来提供HTTP请求.该应用程序应该在具有4个内核的Linux docker容器环境中运行,并且我的处理程序在每个0.2..3 ms处受CPU限制.连接是预先创建和保持连接的,但我目前处理空处理程序的处理时间为0.6..0.8毫秒(回复200 OK),有明显的抖动和偶尔的峰值到20-50毫秒,我不能说明.

是否有任何特定的Kestrel / Sockets / Threads / CLR设置可以帮助最小化每个请求的响应时间?或者使用EPOLL进行C/C++路线是我唯一的选择,如果我想把它降到0.1..0.2毫秒?

解决方法:

Low latency is certainly possible with ASP.NET Core / Kestrel.

这是一个很小的网络应用程序来演示这个……

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之前多次回答过这种类似的问题.

If you wish to compare the ASP.NET Core framework against others this is a great visual 07002. As you can see, ASP.NET Core is has exceptional results and is the leading framework for C#.

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

.NET核心运行时(CoreRT)

如果你还需要更多表现,我建议你看看.Net Core Runtime (CoreRT).

请注意,在撰写本文时,可能需要对此选项进行更详细的审核,然后才能为生产系统进行此操作.

“CoreRT brings much of the performance and all of the deployment benefits of native compilation, while retaining your ability to write in your favorite .NET programming language.”

CoreRT提供了许多应用程序的关键优势.

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

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

>从一台计算机复制单个文件可执行文件,并在不安装.NET运行时的情况下在另一台计算机上运行(同类).
>创建并运行包含单个文件可执行文件的docker镜像(例如,除了Ubuntu 14.04之外的一个文件).

特定于Linux的优化

有一个很好的图书馆,试图处理非常专业的案件.特别是对于Linux(但此代码对其他操作系统是安全的).此优化背后的原理是将libuv传输库(ASP.NET核心使用)替换为另一个特定于Linux的优化.

它直接使用内核原语来实现传输API.这减少了堆分配对象的数量(例如uv_buf_t,SocketAsyncEventArgs),这意味着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

You can take a look at the repository for that middleware on GitHub here 07005

c# – 如何配置asp.net kestrel以实现低延迟?

c# – 如何配置asp.net kestrel以实现低延迟?

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

上一篇:Stat 203V


下一篇:win10右键将文件或图片等另存为时,文件资源管理器总是卡死, 需要一两分钟后才能正常使用