Среда выполнения Service Fabric не освобождает неиспользуемую память от экземпляра службы субъекта

В нашем приложении один запрос создает одного актера в любом разделе, и для обработки одного запроса память увеличивается на 200-250 МБ во время выполнения актера, а после завершения выполнения я удалил актера.

Task.Run(() =>
                        {
                            actorObject.ExecuteGrainAsync(requestId, jsonModel).ContinueWith(async (t) =>
                            {
                                await GrainFactory.DeleteActor(actorObject.GetActorId(), "Workflow", CancellationToken.None);
                            }); 
                        });


 IActorService myActorServiceProxy = ActorServiceProxy.Create(
                new Uri($"fabric:/APPSeConnect.WebAgent/{actorName}"), actorId);
                await myActorServiceProxy.DeleteActorAsync(actorId, cancellationToken);

В разделе нет активных субъектов, что мы можем проверить, запросив структуру, но память все еще заблокирована на много минут (5 минут - более 50 минут). Позже размер памяти exe уменьшается всего на несколько МБ.

В соответствии с этим Document память должна быть востребована средой выполнения в perfecttimeout. Мои настройки

new ActorGarbageCollectionSettings(10, 2)

Я тоже использую этот атрибут

[StatePersistence(StatePersistence.None)]

При параллельной обработке акторов это влияние огромно.


person kishorebarik    schedule 06.03.2020    source источник
comment
Привет, Кишор, ты видел, как твоя память восстановилась после временного промежутка?   -  person abhishek    schedule 12.03.2020
comment
Спасибо за ответ, Абхишек, да, верно, после временного промежутка память автоматически освобождается.   -  person kishorebarik    schedule 12.03.2020


Ответы (1)


Мы столкнулись с проблемой, аналогичной вашей, когда служба актера не удаляет заявленную память в течение 15 минут.

Тестовый пример выглядит так:

  1. Мы запрашиваем актор и ждем, пока актор завершит свое выполнение.
  2. Заявленная память находится в сотнях мегабайт.
  3. После завершения выполнения Актер программно удаляется с использованием DeleteActorAsync API, как вы упомянули.
  4. Для параметраgerbageCollection также задано значение ActorGarbageCollectionSettings = new ActorGarbageCollectionSettings(10, 5).

Но в нашем случае вся память освобождается как минимум за 30 минут. Что заставляет нас думать, что, вероятно, это из-за коллекции Generations of GC.

person abhishek    schedule 12.03.2020