У меня проблема с производительностью сервера kestrel.У меня есть следующий сценарий:
TestClient(JMeter) -> DemoAPI-1(Kestrel) -> DemoAPI-2(IIS)
Я пытаюсь создать пример приложения, которое может получить содержимое файла, как и по запросу.TestClient (100 потоков) запрашивает DemoAPI-1, который, в свою очередь, запрашивает DemoAPI-2.DemoAPI-2 считывает фиксированный XML-файл (не более 1 МБ) и возвращает его содержимое в качестве ответа (в производстве DemoAPI-2 не будет подвергаться воздействию внешнего мира).
Когда я тестировал прямой доступ из TestClient-> DemoAPI-2 Я получил ожидаемый результат (хороший), который выглядит следующим образом:
- Среднее: 368 мс
- Минимум: 40 мс
- Максимум: 1056 мс
- Пропускная способность: 40,1 / сек
Но когда я попытался получить к нему доступ через DemoAPI-1, я получил следующий результат:
- Среднее: 48232 мс
- Минимум: 21095мс
- Максимум: 49377мс
- Пропускная способность: 2,0 / сек
Как вы можете видеть, есть огромная разница. Я не получаю даже 10% пропускная способность DemoAPI-2.Мне сказали, что kestrel более эффективен и быстр по сравнению с традиционными 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 Server2016).
- DemoAPI-1 (kestrel) является автономным API (без обратного прокси-сервера)
- TestClient (jMeter) для этого тестирования установлен на 100 потоков.
- На данный момент никакие другие настройки для сервера kestrel не выполняются.
- На данный момент нет фильтра действий, промежуточного программного обеспечения или журналирования, которые могли бы повлиять на производительность.
- Связь осуществляется с использованием SSL на 5001порт.
- Параметр ожидания для DemoAPI2 на данный момент установлен на 0.
- Загрузка ЦП DEMOAPI-1 не превышает 40%.