【发布时间】:2025-11-26 21:00:01
【问题描述】:
我遇到了红隼服务器的性能问题。我有以下情况:
TestClient(JMeter) -> DemoAPI-1(Kestrel) -> DemoAPI-2(IIS)
我正在尝试创建一个示例应用程序,它可以在请求时获取文件内容。 TestClient(100 Threads) 向 DemoAPI-1 请求,后者又向 DemoAPI-2 请求。 DemoAPI-2 读取一个固定的 XML 文件(最大 1 MB)并将其内容作为响应返回(在生产中 DemoAPI-2 不会暴露给外界)。
当我从 TestClient -> DemoAPI-2 测试直接访问时,我得到了预期的结果(良好),如下所示:
- 平均:368ms
- 最小值:40 毫秒
- 最大值:1056ms
- 吞吐量:40.1/秒
但是当我尝试通过 DemoAPI-1 访问它时,我得到了以下结果:
- 平均:48232ms
- 最小值:21095ms
- 最大值:49377ms
- 吞吐量:2.0/秒
如您所见,两者之间存在巨大差异。我什至没有 DemoAPI-2 的 10% 吞吐量。有人告诉我,与传统的 IIS 相比,红隼更高效、更快速。也因为直接访问没有问题,我想我们可以消除DemoAPI-2上可能出现的问题。
※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代码:
[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 服务器进行其他配置。
- 目前还没有可能影响性能的操作过滤器、中间件或日志记录。
- 在 5001 端口上使用 SSL 进行通信。
- DemoAPI2 的等待参数现在设置为 0。
- DEMOAPI-1 的 CPU 使用率不超过 40%。
【问题讨论】:
-
几乎不可能知道你的瓶颈在哪里,只有你自己才能弄清楚。我建议在本地运行它并使用 dotTrace 之类的东西来查看代码在哪里花费的时间最多。
标签: asynchronous asp.net-core kestrel-http-server