如何配置 asp.net kestrel 实现低延迟?

2024-01-03

我正在尝试实现一个 asp.net 2.2 应用程序,以尽可能低的速度服务 HTTP 请求latency(不是吞吐量,它不是为了生产而是为了某种竞争)。该应用程序应该在具有 4 个核心的 Linux docker 容器环境中运行,并且我的处理程序的 CPU 限制为每个 0.2..3 毫秒。连接是预先创建并保持活动状态的,但目前空处理程序的处理时间约为 0.6..0.8 毫秒(回复 200 OK),有明显的抖动和偶尔达到 20-50 毫秒的峰值,这是我无法做到的解释。

Kestrel/Sockets/Threads/CLR 是否有任何特定设置可以帮助最大限度地缩短每个请求的响应时间?或者,如果我想将其降低到 0.1..0.2 毫秒,那么使用 EPOLL 进行 C/C++ 路线是我唯一的选择?


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!");
    });
}

类似的问题我已经回答过很多次了here https://stackoverflow.com/a/46627920/3645638 and here https://stackoverflow.com/a/47011823/3645638.

如果您想将 ASP.NET Core 框架与其他框架进行比较,这是一个很好的视觉效果。正如您所看到的,ASP.NET Core 具有出色的结果,并且是 C# 的领先框架。

在上面的代码块中,我注意到缺少app.UseMvc()。如果您确实需要它,我已经在这个答案中做了关于获得更好延迟的非常详细的答案:AddMvc() 和 AddMvcCore() 有什么区别? https://stackoverflow.com/a/42365276/3645638


.NET 核心运行时 (CoreRT)

如果您仍然需要更多性能,我建议您查看.Net 核心运行时 (CoreRT) https://github.com/dotnet/corert.

请注意,在撰写本文时,可能需要更详细地审查此选项,然后再针对生产系统进行此操作。

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

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

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

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

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

Linux 特定的优化

有一个很好的库尝试处理非常特殊的情况。特别是对于 Linux(但此代码对于其他操作系统是安全的)。这种优化背后的原理是替换libuv传输库(ASP.NET Core 使用的)具有另一个特定于 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

您可以在 GitHub 上查看该中间件的存储库:https://github.com/redhat-developer/kestrel-linux-transport https://github.com/redhat-developer/kestrel-linux-transport

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何配置 asp.net kestrel 实现低延迟? 的相关文章

随机推荐

  • 我可以对 HTML 表单使用 HTML5 下载属性吗?

    HTML5 引入了一个很好的标记功能 a 链接作为下载端点 只需添加download归因于 a tag 见说明 http www w3schools com tags att a download asp 是否可以对 HTML 表单执行相同
  • 使用 RewriteCond %{QUERY_STRING} 而不将查询字符串附加到新地址

    我尝试使用 htaccess 进行 301 重定向 问题 view products id 12345 gt 8831 旧地址和新地址之间没有任何关系 因为某些原因 Redirect 301 view products id 12345 8
  • 用于更新的 MySql UNION

    有没有办法使用单个 SQL 查询更新多行 每行具有不同的值 我必须用不同的数据更新多行中的一列 对每一行使用单独的更新查询似乎过多 因此如果可能的话 我希望将此过程合并到单个 SQL 语句中 或者至少减少所需的查询数量 我将 PHP 与 Z
  • VMware vFabric 服务器超时

    因此 我下载了 Spring Tool Suite 当我想启动 VMware vFabric tc Server 时 我收到以下消息 服务器 VMware vFabric tc Server Developer Edition v2 6 无
  • 支持的平台、基础 SDK、仅构建活动架构设置在 Pod 更新后恢复

    我的团队最近开始使用 CocoaPods 来管理我们的 iOS 应用程序项目中的依赖关系 这是 pod 文件 platform ios 6 0 pod UI7Kit pod AFNetworking gt 2 0 pod TMCache p
  • 有没有办法检查应用程序签名是否已调试或已发布?

    我目前正在开发 RPC 服务供开发人员使用 但想确保我可以区分另一个应用程序的调试密钥及其公钥 有没有办法检查另一个应用程序的密钥并判断它是否是调试密钥而不是已发布的应用程序密钥 这样做的目的是能够判断他们的应用程序何时处于开发或发布状态
  • Racket 中列表到字符串的转换

    如何在 DrRacket 中将列表转换为字符串 例如 如何将 红黄蓝绿 转换为 红黄蓝绿 我尝试使用 list gt string 但这似乎只适用于字符 这里的技巧是映射列表symbols作为输入接收 依次将每个数字转换为字符串 并在除最后
  • 声明大数组时出现 OutOfMemoryException

    我必须创建一个相当大的双数组 12000ish x 55000ish 不幸的是 我遇到了内存不足的异常 我以前用Java开发 可以更改内存设置 这对于 C 来说是可能的还是根本不可能 我用的是VS 2008 Each double是 8 个
  • NSDecimalNumber 和大型无符号 long long(64 位)整数

    我正在处理来自 JSON 源的大型 64 位无符号整数 这些整数被解析为 NSDecimalNumbers 这显然是 忠实地表示任意精度数字 我遇到的问题是我无法从这门课中得到正确的数字 例如 使用可能的最大值 print unsigned
  • Rails - Devise - 创建注册表

    我一直在用头撞墙 试图了解如何让 Devise 与客户注册一起工作 因此 在我的登陆页面上 我想显示注册表单 因此我将其添加到我的视图中 在该部分中 我在视图中有一个表单标签 如下所示 在我的应用程序布局中 我有 div class div
  • 为什么 API 应返回“void”?

    在编写 API 或可重用对象时 是否有任何技术原因导致所有返回 void 的方法调用不应只返回 this C 中的 this 例如 使用 string 类 我们可以做这样的事情 string input string Join input
  • 如何处理大型二维数组

    我有一个大小为 5428x5428 的二维数组 它是一个对称数组 但是在编译时它给了我一个错误 说数组大小太大 谁能给我提供方法吗 这个数组对于程序堆栈内存来说太大了 这是你的错误 int main double arr 5428 5428
  • 将相机渲染到多个表面 - 屏幕上和屏幕外

    我想将相机输出渲染到视图中 并偶尔将相机输出帧保存到文件中 约束是 保存的帧应该是相同分辨率当相机被配置时 而视图是小于相机输出 保持纵横比 基于grafika 中的 ContinuousCaptureActivity 示例 https g
  • python 检查一个方法是否被调用而不模拟它

    class A def tmp self print hi def b a a tmp 要检查 b 中是否调用了 tmp 方法 推荐的方法是 a A a tmp MagicMock b a a tmp assert called 但这里的
  • 模块中具有相对于调用该模块的文件的相对路径

    假设我有当前的文件结构 应用程序 模块 module py 应用程序 模块 somefile txt 应用程序 脚本 script py 应用程序 main py 模块 script py import sys sys path appen
  • 组合多个 NSArray

    如何将多个 NSArray 组合成一个具有交替值的数组 例如 系列一 橙子 苹果 梨 阵列二 乔木 灌木 花卉 阵列三 蓝色 绿色 黄色 最终的数组需要是 橙色 树木 蓝色 苹果 灌木 绿色等 1 2 3 4 5 6 valueForKey
  • 如何发送文本消息而不是字节消息

    我正在使用与我的 JMS 队列对话的 blueprint xml 构建骆驼路线 我遇到了神秘的错误 我的 Spring Boot 应用程序充当队列的消费者 将我的 xml 作为字节消息而不是文本消息发送 并且 Spring 消费者对此感到窒
  • Google Sheet OAuth 范围只能访问几个文件?

    我们有一个受限制的应用程序 我们可以在其中控制用户帐户的创建 我们还使用 Google 登录 目前 该应用程序尚未经过验证 但它很好 因为所有用户都在我们的 GSuite 域中 但我们希望将其扩展到 GSuite 域之外的用户 用户可以在我
  • Nginx 多个 Node JS Express 应用程序的多个位置

    我有以下配置 location proxy set header X Real IP remote addr proxy set header X Forwarded For proxy add x forwarded for proxy
  • 如何配置 asp.net kestrel 实现低延迟?

    我正在尝试实现一个 asp net 2 2 应用程序 以尽可能低的速度服务 HTTP 请求latency 不是吞吐量 它不是为了生产而是为了某种竞争 该应用程序应该在具有 4 个核心的 Linux docker 容器环境中运行 并且我的处理