Низкая задержка, безусловно, возможна с 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!");
});
}
Я много раз отвечал на подобный вопрос раньше здесь и здесь.
Если вы хотите сравнить платформу ASP.NET Core с другими, это отличное наглядное пособие https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext. Как видите, ASP.NET Core дает исключительные результаты и является ведущей платформой для C#.
В моем блоке кода выше я отметил отсутствие app.UseMvc()
. Если вам это нужно, я дал очень подробный ответ об уменьшении задержки в этом ответе: В чем разница между AddMvc() и ДобавитьMvcCore()?
Среда выполнения .NET Core (CoreRT)
Если вам по-прежнему требуется более высокая производительность, я рекомендую вам ознакомиться с .Net Core Runtime (CoreRT). .
Обратите внимание, что на момент написания этой статьи этот вариант, вероятно, необходимо рассмотреть более подробно, прежде чем использовать его для производственной системы.
CoreRT обеспечивает большую часть производительности и все преимущества развертывания собственной компиляции, сохраняя при этом возможность писать на вашем любимом языке программирования .NET.
CoreRT предлагает большие преимущества, которые имеют решающее значение для многих приложений.
- Собственный компилятор создает ОДИН ФАЙЛ, включая приложение, управляемые зависимости и CoreRT.
- Нативные скомпилированные приложения запускаются быстрее, поскольку они выполняют уже скомпилированный код. Им не нужно генерировать машинный код во время выполнения или загружать JIT-компилятор.
- Скомпилированные в собственном коде приложения могут использовать оптимизирующий компилятор, что приводит к увеличению пропускной способности за счет более высокого качества кода (оптимизация компилятора C++). Компиляторы LLILLC и IL в CPP полагаются на оптимизирующие компиляторы.
Эти преимущества открывают новые возможности для разработчиков .NET.
- Скопируйте один исполняемый файл с одного компьютера и запустите его на другом (того же типа) без установки среды выполнения .NET.
- Создайте и запустите образ докера, содержащий один исполняемый файл (например, один файл в дополнение к Ubuntu 14.04).
Оптимизация для Linux
Существует хорошая библиотека, которая пытается справиться с очень специфическими случаями. В частности для Linux (но этот код безопасен для других операционных систем). Принцип этой оптимизации заключается в замене транспортной библиотеки libuv
(которую использует ASP.NET Core) другой оптимизацией для Linux.
Он напрямую использует примитивы ядра для реализации Transport API. Это уменьшает количество объектов, выделенных в куче (например, uv_buf_t
, SocketAsyncEventArgs
), что означает меньше нагрузки на сборщик мусора. Реализации, построенные на основе 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://developers.redhat.com/blog/2018/07/24/improv-net-core-kestrel-performance-linux/
person
Svek
schedule
09.01.2019