
Igor
16.08.2017
20:25:10

Vasily
16.08.2017
20:26:06
Т.е. по факту отдаешь статику

Vladimir
16.08.2017
20:28:42
Контент это же и будет json, который я сохраню, а как я весь запрос с хедерами одной строкой отдам? Надо тогда свой middleware писать в обход giraffe получается?

Evgeniy
16.08.2017
20:32:46
Я про эти констрейнты, синтаксис не помню
Потому что он ужасный.
type Foobar() =
member this.Hello s = printfn "Hello %s" s
let inline hello (a: ^T) s =
(^T : (member Hello : string -> unit) a, s)
let baz = Foobar()
hello baz "World"

Google

Vasily
16.08.2017
20:34:24

Evgeniy
16.08.2017
20:35:15

Igor
16.08.2017
20:35:17

Evgeniy
16.08.2017
20:35:35

Roman
16.08.2017
20:35:39

Летучая
16.08.2017
20:39:06
Можно прям в тип принимаемой переменной констрейнт загнать (есть мнение, что так читаемее)

Evgeniy
16.08.2017
20:40:07

Igor
16.08.2017
20:40:10
VSCode кстати обновился и Ionide (может и netstandard 2.0 пофиксили, но врядли)

Evgeniy
16.08.2017
21:16:50
Логи на telegrammy почему-то уже давно не обновляются.

Vladimir
16.08.2017
22:07:30
Добавил отдачу предсериализованных запросов, теперь доживаем до 1500 RPS =) Но это все еще 35% фейлов

Vasily
17.08.2017
05:42:14
Надо дальше смотреть

Vladimir
17.08.2017
05:50:49
Могу только сказать что сериализация не сильно мешала, вот сравнение
http://clip2net.com/s/3N049BG
http://clip2net.com/s/3N04bsA
т.е. разница между отдачей чистых строк и поиск с подсчетом среднего и сериализацией разнятся на 30-50% всего

Google

Vladimir
17.08.2017
05:51:48
А тут надо раз в 5 производительность улучшать)
пока самый очевидный вариант это отказываться от словарей и базу загружать
ну еще может как-то можно kestrel потюнить, но пока не знаю как)

Aleksander
17.08.2017
05:58:42
а почему сперва не запустить локально и запрофайлить?

Nikolay
17.08.2017
06:00:51

Vladimir
17.08.2017
06:02:16
ну разве что еще ConcurrentDictionary на Dictionary заменить, ну собственно и на этом все будет)

Aleksander
17.08.2017
06:07:06

Vladimir
17.08.2017
06:07:35
ну или массив сделать и по индексу брать, как Василий предлагал. Там миллион записей по 100байт, получится 100мб, должно выдержать

Aleksander
17.08.2017
06:08:10
по поводу того как профайлить - можно начать прямо из студии

Vladimir
17.08.2017
06:08:35
студия пока не поддерживает .net core c фшарпом)

Aleksander
17.08.2017
06:08:50
судя по min response time 400ms, там что-то очень нетак:)

Vladimir
17.08.2017
06:09:16
это микросекунды

Evgeniy
17.08.2017
06:09:28

Aleksander
17.08.2017
06:09:46
ms = миллисекунды, нет?
микросекунд у тебя не будет)

Vladimir
17.08.2017
06:10:13
не, тогда бы все было совсем плохо
там такие цифры появляются потом 1641247037 ms

Google

Vladimir
17.08.2017
06:11:16
это в сумме, а один ответ 45080695ms

Aleksander
17.08.2017
06:12:32
ну, я не знаю, я человек простой. если написано s - я понимаю как секунда. если ms - миллисекунда.

Vladimir
17.08.2017
06:13:17
на самом деле даже еще меньше

Aleksander
17.08.2017
06:13:59
и я бы скорее поверил что все плохо, чем то что ты с юзер-спейс вебсервера в докере на какой-то виртуалке отдаешь ответ за <1 ms

Vladimir
17.08.2017
06:15:10
не, спрашивали уже в чате соревнования, это микросекунды)
нету сети просто
запросы с этой же машины идут
все сходится, бот скажем делает 1к запросов в секунду в одном потоке, это значит что он ожидает 1мс на каждый ответ максимум
мне посути надо дожить до 2к в секунду
это значит что все запросы должны быть в среднем меньше 500мкс

Aleksander
17.08.2017
06:20:59
а, ну если без сети - то возможно)
https://github.com/aspnet/IISIntegration/issues/220 - вот тут у людей похожие цифры, на windows правда, и, кстати RPS ~ 10k

Vladimir
17.08.2017
06:26:28
ну мне от этого бенчмарка не легче)
там создают сначала 1 поток, а если не успевает отвечать скажем до 500мкс на запрос, то врубают 400 потоков
а не 10 как в примере)
и сразу же после этого переключения все загибается

Aleksander
17.08.2017
06:29:26
а они выдают статистику по времени для неправильных ответов?

Vladimir
17.08.2017
06:30:18
нет, только косвенно можно посмотреть по общему графику времени ответов на запрос

Aleksander
17.08.2017
06:30:53
просто если закинуть туда "голый" kestrel без логики вообще, и посмотреть как он будет жить

Google

Vladimir
17.08.2017
06:32:18
голый смысла думаю нет, он сможет до 500мкс всегда отвечать
и 400 потоков они не врубят

Aleksander
17.08.2017
06:32:40
поставь задержку)

Vladimir
17.08.2017
06:34:26
можно)
но главная ж идея посмотреть что в реальных задачах можно получить по RPS

Aleksander
17.08.2017
06:37:22
ну ты же, насколько я понял, решаешь сейчас - вкладывать ли время в тюнинг кестрела, или в работу над логикой.. так ты сможешь понять конкретно, в чем беда
если кестрел будет работать за 100мкс без задержки, а с задержкой держаться против 400 потоков - тогда ставим галочку и идем пилить логику) если нет - то и логикой смысла не будет заниматься

Vladimir
17.08.2017
06:39:36
да, согласен) сейчас хочу еще с массивами попробовать вместо словарей, потом голый кестрел проверю

Aleksander
17.08.2017
06:39:38
причем там же еще прослойка в виде giraffe, тоже может влиять)
так что можно 3 случая: чисто кестрел, кестрел + жираф, и полное приложение

Vladimir
17.08.2017
06:40:31
2 запуска в день только можно)

Vasily
17.08.2017
06:40:42
Надо еще внимательно на валидацию смотреть
Кинь ссылку на актуальный репозиторий

Vladimir
17.08.2017
06:41:53
сча. Валидация сейчас эксепшны кидает если параметры гет-запроса невалидные

Vasily
17.08.2017
06:42:17
Эксепшны дорогие довольно

Vladimir
17.08.2017
06:42:20
https://github.com/Lanayx/PerformanceTest
ну тогда надо писать валидатор полей вручную
через chiron

Vasily
17.08.2017
06:43:40
Консольный вывод отруби еще

Vladimir
17.08.2017
06:44:28
чего, он не влияет почти, раз в 1000 запросов только работает

Google

Vasily
17.08.2017
06:44:45
Это в каунтере

Vladimir
17.08.2017
06:45:02
а больше нигде и не пишет)

Vasily
17.08.2017
06:53:13
Короче
Идем дальше
В целом идея этого соревнования,похоже,повторить event sourcing
Поэтому есть смысл по максимуму отказаться от сериализации/десериализации

Vladimir
17.08.2017
07:03:47
так уже)

Vasily
17.08.2017
07:04:21
При добавлении/обновлении данных не надо сразу валидировать,по идее

Vladimir
17.08.2017
07:04:38
нельзя, надо же невалидные данные отбрасывать
с 400 ошибкой

Vasily
17.08.2017
07:05:03
На получении?
Или на добавлении?

Vladimir
17.08.2017
07:05:23
на добавлении
на получении тоже

Vasily
17.08.2017
07:07:17
Значит,надо ускорять десериализацию
Точнее не так
Надо в процессе десериализации валидировать данные

Vladimir
17.08.2017
07:08:35
=) не понял)

Vasily
17.08.2017
07:09:42
В json.net можно написать конвертер по идее

Vladimir
17.08.2017
07:10:49
не, не понял смысл идеи)

Vasily
17.08.2017
07:11:03
Идея в том, что если при десериализации попалось невалидное поле,то дальше можно не ходить

Vladimir
17.08.2017
07:11:16
ну, сейчас так и работает