Я пытаюсь создать приложение веб-API, которое сможет обрабатывать 10K + req/sec.Как улучшить производительность веб-интерфейса .NET Core?
Я создал пустой проект API .NET Core с одним действием GET, которое просто возвращает строку. Я публикую свое самодостаточное приложение на сервере Debian8.
dotnet publish -r debian.8-x64 -c Release
Затем я запускаю тест нагрузки с использованием теста Apache Benchmark, используя следующие параметры.
ab -n 50000 -c -k 200 localhost:5000/api/cnt/dummy
Результат испытания: 4.5K req/sec.
Есть ли способ повысить производительность моего приложения веб-API?
Мой project.json
файл:
{
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.0.1"
},
"Microsoft.ApplicationInsights.AspNetCore": "1.0.0",
"Microsoft.AspNetCore.Mvc": "1.0.1",
"Microsoft.AspNetCore.Routing": "1.0.1",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
"Microsoft.AspNetCore.ResponseCompression": "1.0.0"
},
"tools": {
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
},
"frameworks": {
"netcoreapp1.1": {
"imports": [
"dnxcore50",
"portable-net45+win8"
]
}
},
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true,
"System.GC.Concurrent": true
}
},
"runtimes": {
"win10-x64": {},
"debian.8-x64": {}
},
"publishOptions": {
"include": [
"wwwroot",
"**/*.cshtml",
"appsettings.json",
"web.config"
]
},
"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}
Мой Startup.cs
файл:
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsEnvironment("Development"))
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
}
}
Посмотрите здесь https://github.com/aspnet/benchmarks. Сравнение прогонов ваших тестов с предоставленными .NET должно сказать вам, является ли это проблемой для вашего кода или вашего оборудования. Каковы характеристики машины на вашем запуске, что такое использование ЦП? – CountZero
Вы пытались использовать Profiler для понимания производительности приложения? Вы можете просто использовать Visual Studio Profiler, чтобы узнать, что делает большая часть работы, и использовать эти знания для повышения производительности вашего приложения. – PhillipH
Как стартер, задайте себе вопрос, нужен ли вам MVC или нет. Действительно высокая пропускная способность лучше всего делать непосредственно в Middleware. Ведение журнала и анализ затрат. Кроме того, ваш счетчик может ошибаться из-за потоковой передачи. – Thomas