首页 > 解决方案 > Service Fabric 运行时未从 Actor 服务实例回收未使用的内存

问题描述

我们的应用,一个请求在任意一个分区创建一个actor,处理一个请求在actor执行过程中内存增加200MB-250MB,执行完成后我删除了actor

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 内存大小只减少了几 MB。

根据这个文档内存应该由运行时在理想超时中声明。我的设置是

new ActorGarbageCollectionSettings(10, 2)

我也在使用这个属性

[StatePersistence(StatePersistence.None)]

在演员的并行处理期间,它的影响是巨大的。

标签: service-fabric-actorservice-fabric-on-premises

解决方案


我们一直面临与您类似的问题,Actor Service 没有在 15 分钟内删除其声称的内存。

测试用例如下:

  1. 我们请求一个 Actor 并等待该 Actor 完成其执行。
  2. 声称的内存以 100 MB 为单位。
  3. 执行完成后,使用DeleteActorAsync您提到的 API 以编程方式删除 Actor。
  4. garbageCollection 设置也设置为 ActorGarbageCollectionSettings = new ActorGarbageCollectionSettings(10, 5)。

但在我们的例子中,整个内存至少在 30 分钟内被释放。这让我们认为这可能是因为几代人的 GC 收集。


推荐阅读