HttpListener max requests per second
От: vaa  
Дата: 21.06.22 01:58
Оценка:
Тестировал производительность реального кода (по get-запросу лезет в базу firebird и возвращает json).
.net472 на await-ах.
тестировал nbomber-ом(dotnet). клиент и сервер на одной тачке win10x64 i3 8Гб озу( не быстрая).
на 5 в сек 100% успех
на 10 уже только 95%.
тест длится 30 секунд.
Exception: Указанное сетевое имя более недоступно
                   Member Name: Void EndWrite(System.IAsyncResult)
                   Class Defining Member: System.Net.HttpResponseStream
                   Member Type: Method
                   Source: System
                   Stack Trace:    в System.Net.HttpResponseStream.EndWrite(IAsyncResult asyncResult)
                      в System.IO.Stream.<>c.<BeginEndWriteAsync>b__53_1(Stream stream, IAsyncResult asyncResult)
                      в System.Threading.Tasks.TaskFactory`1.FromAsyncTrimPromise`1.Complete(TInstance thisRef, Func`3 endMethod, IAsyncResult asyncResult, Boolean requiresSynchronization)
                   --- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
                      в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
                      в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                      в System.Runtime.CompilerServices.TaskAwaiter.GetResult()

Ошибка возникает здесь:
            await resp.OutputStream.WriteAsync(data, 0, data.Length);

в экспериментах заметил подозрительное, если к GetContext добавить ConfigureAwait(false) то ошибка возникает гораздо чаще.
await-ы вроде везде стоят.
не пойму в чем проблема.
Да, еще если завершить энбомбера, еще долго идут запросы к приложению. как будто очередь забилась.
Подозреваю, что это системные ограничения не связанные напрямую с дотнетом.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: HttpListener max requests per second
От: RushDevion Россия  
Дата: 21.06.22 08:50
Оценка: 4 (1)
Бомбер стучится к приложению по localhost или по доменному имени?
Если по доменному, то проверить настройки по макс.количеству подключений (см. https://habr.com/ru/post/424873 — они разные для .NET и .NET Core).
Если по localhost, то приложение случайно не на HttpListener'е сделано? Попробуй увеличить очередь входящих запросов, примерно вот так.
Отредактировано 21.06.2022 9:00 RushDevion . Предыдущая версия .
Re[2]: HttpListener max requests per second
От: vaa  
Дата: 21.06.22 09:50
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Бомбер стучится к приложению по localhost или по доменному имени?


по короткому имени(без точек). не знаю доменное или нетбиос. но не локалхост.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: HttpListener max requests per second
От: RushDevion Россия  
Дата: 21.06.22 10:11
Оценка:
vaa>по короткому имени(без точек). не знаю доменное или нетбиос. но не локалхост.

Ну тогда, вероятно, дело в лимите подключений на домен.
Запусти пока бомбер работает: netstat -af | findstr <твой_домен>
Увидишь, сколько реально создается HTTP-соединений к твоему приложению.

Кстати, тот пример, что в git'e у меня начинал пятисотить на ~400-450 RPS (время обработки запроса >500ms).
Отредактировано 21.06.2022 10:17 RushDevion . Предыдущая версия .
Re[4]: HttpListener max requests per second
От: vaa  
Дата: 22.06.22 01:56
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Запусти пока бомбер работает: netstat -af | findstr <твой_домен>

сделал тестовый сервис на корке. странно, но даже поиск по номеру порта пуст во время запуска.


RD>Кстати, тот пример, что в git'e у меня начинал пятисотить на ~400-450 RPS (время обработки запроса >500ms).


Добавил рандомную задержку 200 — 1500 и стал считать кол-во запросов более 900 мс.
оказалось ровно столько фэйлится в бомбере, видимо в нем таймаут на ожидание и он разрывает соединение.
надеюсь реальный клиент подождет данные
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.