@Fsharp_chat

Страница 278 из 772
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
вначала руками вызываю чтобы хватило на весь обстрел, но не хватает
https://msdn.microsoft.com/en-us/library/system.gc.trystartnogcregion.aspx Это было?

Vasily
22.08.2017
10:23:52
Кстати, нагрузку на гц можно убрать

Если хранить пользователей в виде словарей

И локейшны

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
что было и где?)
Использовал GC.TryStartNoGCRegion?

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

по идее, mutable records спасут

Vladimir
22.08.2017
10:26:00
Использовал GC.TryStartNoGCRegion?
неа, а как его юзать?

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

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
по ссылке ничего не понятно) расскажи плиз идею как ты хочешь его использовать
По идее ты вызываешь этот метод, перед куском кода в период исполнения которого ты хотел бы чтоб ГЦ не срабатывал. TryStartNoGCRegion Твой критический участок кода EndNoGCRegion

Nikolay
22.08.2017
10:32:41
аа, может быть и можно, но когда код сначала метода пишешь, то нельзя. Теперь уже думаю можно удалить)
Как-то так делается: let deserializeObj<'a> json = ... // return 'a let deserializeObject json = deserializeObj json А потом юзать так: let newUser: User = deserializeObject json Но в твоём кейсе : User писать не обязательно

Vladimir
22.08.2017
10:32:59
По идее ты вызываешь этот метод, перед куском кода в период исполнения которого ты хотел бы чтоб ГЦ не срабатывал. TryStartNoGCRegion Твой критический участок кода EndNoGCRegion
Спасибо) Но мне такое не подходит) мне нужно чтобы на протяжении всех 100К запросов на протяжении 2й фазы GC не сработал ни разу

Nikolay
22.08.2017
10:33:59
Спасибо) Но мне такое не подходит) мне нужно чтобы на протяжении всех 100К запросов на протяжении 2й фазы GC не сработал ни разу
Попробуй выключить GC на прогреве, затем пока будет ожидание перед следующим обстрелом включи его, а когда посыпятся дальше запросы, опять выключи)

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- имя свойства

Страница 278 из 772