ASP.NET Core 2.2 Kestrel服务器的性能问题

编程入门 行业动态 更新时间:2024-10-12 10:25:46
本文介绍了ASP.NET Core 2.2 Kestrel服务器的性能问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我面临着Kestrel服务器性能的问题.我有以下情况:

I'm facing problem with kestrel server's performance. I have following scenario :

TestClient(JMeter) -> DemoAPI-1(Kestrel) -> DemoAPI-2(IIS)

我正在尝试创建一个示例应用程序,该应用程序可以在请求时获取文件内容.TestClient(100个线程)向DemoAPI-1请求,而后者又向DemoAPI-2请求.DemoAPI-2读取一个固定的XML文件(最大1 MB)并返回其内容作为响应(在生产中,DemoAPI-2不会暴露给外界).

I'm trying to create a sample application that could get the file content as and when requested. TestClient(100 Threads) requests to DemoAPI-1 which in turn request to DemoAPI-2. DemoAPI-2 reads a fixed XML file(1 MB max) and returns it's content as a response(In production DemoAPI-2 is not going to be exposed to outside world).

当我测试了从TestClient-> DemoAPI-2的直接访问时,得到了以下预期结果(好):

When I tested direct access from TestClient -> DemoAPI-2 I got expected result(good) which is following :

  • 平均:368ms
  • 最少:40ms
  • 最长:1056ms
  • 吞吐量:40.1/秒
  • 但是当我尝试通过DemoAPI-1访问它时,得到了以下结果:

    But when I tried to access it through DemoAPI-1 I got following result :

  • 平均:48232ms
  • 最少:21095ms
  • 最长:49377ms
  • 吞吐量:2.0/秒
  • 如您所见,两者之间存在巨大差异.我什至没有获得10%的DemoAPI-2吞吐量.我被告知,与传统的IIS相比,茶est具有更高的效率和速度.另外,由于直接访问没有问题,我认为我们可以消除在DemoAPI-2上出现问题的可能性.

    As you can see there is a huge difference.I'm not getting even the 10% throughput of DemoAPI-2. I was told has kestrel is more efficient and fast compared to traditional IIS. Also because there is no problem in direct access, I think we can eliminate the possible of problem on DemoAPI-2.

    ※DemoAPI-1的代码:

    ※Code of DemoAPI-1 :

    string base64Encoded = null; var request = new HttpRequestMessage(HttpMethod.Get, url); var response = await this.httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead).ConfigureAwait(false); if (response.StatusCode.Equals(HttpStatusCode.OK)) { var content = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false); base64Encoded = Convert.ToBase64String(content); } return base64Encoded;

    ※DemoAPI-2的代码:

    ※Code of DemoAPI-2 :

    [HttpGet("Demo2")] public async Task<IActionResult> Demo2Async(int wait) { try { if (wait > 0) { await Task.Delay(wait); } var path = Path.Combine(Directory.GetCurrentDirectory(), "test.xml"); var file = System.IO.File.ReadAllText(path); return Content(file); } catch (System.Exception ex) { return StatusCode(500, ex.Message); } }

    一些其他信息:

  • 两个API都是异步的.
  • 这两个API都托管在不同的EC2实例(C5.xlarge Windows Server 2016)上.
  • DemoAPI-1(kestrel)是一个自包含的API(没有反向代理)
  • TestClient(jMeter)设置为此测试的100个线程.
  • 到目前为止,尚未对kestrel服务器进行其他配置.
  • 到目前为止,还没有可以影响性能的操作过滤器,中间件或日志记录.
  • 使用SSL在5001端口上进行通信.
  • 到目前为止,DemoAPI2的等待参数已设置为0.
  • DEMOAPI-1的CPU使用率不超过40%.
  • 推荐答案

    该问题归因于HttpClient的端口耗尽问题.我能够通过使用IHttpClientFactory解决此问题.下一篇文章可能会帮助遇到类似问题的人.

    The problem was due to HttpClient's port exhaustion issue. I was able to solve this problem by using IHttpClientFactory. Following article might help someone who faces similar problem.

    www.stevejgordon.co.uk/httpclient-creation-and-disposal-internals-should-i-dispose-of-httpclient

    更多推荐

    ASP.NET Core 2.2 Kestrel服务器的性能问题

    本文发布于:2023-11-14 04:05:58,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1586167.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:性能   服务器   NET   ASP   Core

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!