首页 > 解决方案 > 为什么 aspnetcore 服务响应时间会随着并发客户端数量的增加而增加?

问题描述

我有 ASPNETCORE webapi。

控制器:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase {
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get() {
        return new string[] { "value1", "value2" };
    }     

    [HttpGet("data")]
    public Stream GetData() {            
        var files = Directory.GetFiles(@"C:\TestData\1");
        MemoryStream stream = new MemoryStream();
        foreach (var file in files) {
            var bytes = System.IO.File.ReadAllBytes(file);
            stream.Write(bytes, 0, bytes.Length);
        }
        stream.Seek(0, SeekOrigin.Begin);           
        return stream;
    }
}

程序.cs:

 public class Program {
        public static void Main(string[] args) {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseKestrel()
                .UseStartup<Startup>();
    }

启动类:

 public class Startup {
    public Startup(IConfiguration configuration) {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services) {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
        if (env.IsDevelopment()) {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();
    }
}

下面的请求是使用 jmeter 发送的,斜坡持续时间为 0,这意味着所有请求都是并发的。

下面是req的响应时间表:http://localhost:5000/api/values/data(涉及IO)

在此处输入图像描述

下面是req的响应时间表:http://localhost:5000/api/values(涉及NO IO)

在此处输入图像描述

所以我的问题是,为什么随着并行/并发请求数量的增加响应时间增加?虽然 apsnetcore webapi 使用工作线程来服务每个请求,但为什么它们不能同时完成?

任何人都可以解释为什么当有更多并发请求时独立工作线程会花费更多时间。

提前致谢。

标签: c#windowsasp.net-corewebapi

解决方案


推荐阅读