
Vladimir
22.08.2017
10:15:50
вначала руками вызываю чтобы хватило на весь обстрел, но не хватает

Vasily
22.08.2017
10:16:08
Ссылку кинь еще раз на репу
Если бы пика не было, ты был бы, думаю, в районе 20 места

Vladimir
22.08.2017
10:17:51
врядли, надо еще апдейт ускорить, я сейчас апдейт в один поток делаю через актора)

Google

Vasily
22.08.2017
10:18:12
апдейт можно распараллелить по идее

Vladimir
22.08.2017
10:18:46
да, надо его распараллелить и вместо актора поставить какую-нить струтуру синхронизации

Vasily
22.08.2017
10:19:18
В целом отрым от го не настолько большой

Vladimir
22.08.2017
10:19:23
https://github.com/Lanayx/PerformanceTest

Vasily
22.08.2017
10:19:24
*отрыв

Vladimir
22.08.2017
10:19:43
уже да) keep-alive очень сильно зарешал похоже

Vasily
22.08.2017
10:19:57
Ну у них некорректные настройки сервера были
Дающие конкурентные преимущества отдельным решениям

Vladimir
22.08.2017
10:20:45
ага. Вот кстати что еще поменял
options.ApplicationSchedulingMode <- Abstractions.Internal.SchedulingMode.Inline
думаю это тоже помогло

Vasily
22.08.2017
10:21:34
А зачем тебе везде CLIMutable, кстати?

Vladimir
22.08.2017
10:22:05
без них сериализация не прокатывала

Vasily
22.08.2017
10:22:15
Обратная, шоле?

Google

Vasily
22.08.2017
10:22:21
Она ж вроде не нужна

Vladimir
22.08.2017
10:22:22
или десереализация, уже не помню)

Vasily
22.08.2017
10:22:23
По идее

Vladimir
22.08.2017
10:23:20
ну сча не знаю, когда Json.Net был, он же дефолтный конструктор вызывает и потом set на проперти

Roman
22.08.2017
10:23:29

Vasily
22.08.2017
10:23:52
Кстати, нагрузку на гц можно убрать
Если хранить пользователей в виде словарей
И локейшны

Vladimir
22.08.2017
10:24:30

Vasily
22.08.2017
10:25:00
let updateUser (oldUser:User) (httpContext: HttpContext) =
task {
let! json = getStringFromRequest httpContext
let newUser = deserializeObject<UserUpd>(json)
let updatedUser =
{ oldUser with
first_name = if newUser.first_name = null then oldUser.first_name else newUser.first_name
last_name = if newUser.last_name = null then oldUser.last_name else newUser.last_name
birth_date = if newUser.birth_date.HasValue |> not then oldUser.birth_date else newUser.birth_date.Value
gender = if newUser.gender.HasValue |> not then oldUser.gender else newUser.gender.Value
email = if newUser.email = null then oldUser.email else newUser.email }
if (isValidUser updatedUser |> not)
then failwith "Invalid data"
return updatedUser
}

Roman
22.08.2017
10:25:08

Vasily
22.08.2017
10:25:13
Я так понимаю, в апдейтах гц шалит
по идее, mutable records спасут

Vladimir
22.08.2017
10:26:00

Vasily
22.08.2017
10:26:04
чтобы перевыделения памяти не было

Nikolay
22.08.2017
10:26:25

Vladimir
22.08.2017
10:26:43


Vasily
22.08.2017
10:27:10
Дык что на третьей фазе происходит?
Частые апдейты или что?

Google

Vladimir
22.08.2017
10:27:28
только геты

Roman
22.08.2017
10:27:33

Vasily
22.08.2017
10:27:37
А, тогда просто решается\

Nikolay
22.08.2017
10:28:13

Vladimir
22.08.2017
10:28:29
Посмотри по ссылке)
по ссылке ничего не понятно) расскажи плиз идею как ты хочешь его использовать

Vasily
22.08.2017
10:29:51
let getEntity (serializedCollection: SerializedCollection) id next =
if (id > serializedCollection.Length)
then setStatusCode 404 next
else
match serializedCollection.[id] with
| null -> setStatusCode 404 next
| serializedEntity -> setHttpHeader "Content-Type" "application/json" >=> setBodyAsString serializedEntity <| next
По идее, небольшая замена матча
Может ускорить
Хотя надо SerializedCollection string option
И заполнять None

Vladimir
22.08.2017
10:31:25
зачем?

Vasily
22.08.2017
10:31:39
Возможно, там неявный боксинг
Хотя это не точно

Vladimir
22.08.2017
10:31:45
не, строки же
строки не боксятся)

Roman
22.08.2017
10:32:00

Nikolay
22.08.2017
10:32:41

Vladimir
22.08.2017
10:32:59

Nikolay
22.08.2017
10:33:59

Google

Vladimir
22.08.2017
10:34:42
Так сейчас и сделано

Vasily
22.08.2017
10:34:43
Кстати, тупой вопрос
Максимальные размеры данных для пользователя/локейшена этц указаны?

Vladimir
22.08.2017
10:35:27
неа
на самом деле данные все есть)
Можно их посмотреть
https://github.com/sat2707/hlcupdocs/tree/master/data/FULL/data

Vasily
22.08.2017
10:36:31
https://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time

Vladimir
22.08.2017
10:37:13
да, это то что Роман предлагал) но не подходит

Vasily
22.08.2017
10:37:22
Второй ответ
А не первый
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.gclatencymode.sustainedlowlatency?view=netframework-4.7

Vladimir
22.08.2017
10:39:30
SustainedLowLatency я пробовал, толку нет
Я думаю тут проблема не в том как не дать GC пройти, а в том что немножко памяти не хватает чтобы додержаться

Vasily
22.08.2017
10:39:55
gcConcurrent выставлен?

Vladimir
22.08.2017
10:40:04

Vasily
22.08.2017
10:40:15
В принципе тебе сильно много памяти не надо
Можно попробовать партишнинг
Разбить коллекции с ответами на более мелкие

Vladimir
22.08.2017
10:41:45
толку, они ж не собираются

Google

Vasily
22.08.2017
10:41:46
Условно вместо одной коллекции локаций сделать 8
проблема у тебя на самом деле на апдейтах, судя по всему

Vladimir
22.08.2017
10:42:52
проблема там есть конечно) но после них GC.Collect вызываю руками

Vasily
22.08.2017
10:43:32
Тогда уж GC.Collect(2);GC.WaitForPendingFinalizers();GC.Collect(2);
А не просто Collect
Тебе же зафорсить надо сборку

Vladimir
22.08.2017
10:46:26
врядли это сильно поможет, во 2 думаю собирать нечего
но конечно можно попробовать

Vasily
22.08.2017
10:46:51
2 значит, что собираются все, включая 0,1,2

Vladimir
22.08.2017
10:47:12
сейчас стоит GC.Collect(1)

Vasily
22.08.2017
10:47:23
Ну можно и 1
Фишка в том, чтобы дождаться сборки
Впрочем, проблему можно решить более радикально

Vladimir
22.08.2017
10:48:56
она и сейчас проходит
я по логам вижу

Vasily
22.08.2017
10:49:24
Идея в том, чтобы изменить логику хранения объектов

Vladimir
22.08.2017
10:49:24
что вначале 3го этапа сборка 1го уровня прошла
память сэкономить?

Vasily
22.08.2017
10:49:46
Сейчас ты хранишь рекорды
По идее, можно хранить наборы словарей
Где ключом является int*string
где int - идентификатор, string- имя свойства