2017-01-20 9 views
1

Я пытаюсь создать приложение веб-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(); 
    } 
} 
+5

Посмотрите здесь https://github.com/aspnet/benchmarks. Сравнение прогонов ваших тестов с предоставленными .NET должно сказать вам, является ли это проблемой для вашего кода или вашего оборудования. Каковы характеристики машины на вашем запуске, что такое использование ЦП? – CountZero

+0

Вы пытались использовать Profiler для понимания производительности приложения? Вы можете просто использовать Visual Studio Profiler, чтобы узнать, что делает большая часть работы, и использовать эти знания для повышения производительности вашего приложения. – PhillipH

+0

Как стартер, задайте себе вопрос, нужен ли вам MVC или нет. Действительно высокая пропускная способность лучше всего делать непосредственно в Middleware. Ведение журнала и анализ затрат. Кроме того, ваш счетчик может ошибаться из-за потоковой передачи. – Thomas

ответ

1

Из нашего опыта ab не позволит вам ударить по этому номеру. Вам нужен другой инструмент для тестирования нагрузки, например https://github.com/wg/wrk. Некоторые другие тоже будут работать.

Вы все же можете попытаться использовать несколько процессов ab одновременно. Затем используйте определенное количество клиентов в течение определенного времени. Например, -c 20 -t 30 -k.