Service Fabric 运行时未从 Actor 服务实例回收未使用的内存

Posted

技术标签:

【中文标题】Service Fabric 运行时未从 Actor 服务实例回收未使用的内存【英文标题】:Service Fabric runtime is not reclaiming unused memory from Actor Service Instance 【发布时间】:2020-06-19 05:51:02 【问题描述】:

我们的应用,一个请求在任意一个分区创建一个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。

根据这个Document 内存应该由运行时在idealtimeout 中声明。我的设置是

new ActorGarbageCollectionSettings(10, 2)

我也在用这个属性

[StatePersistence(StatePersistence.None)]

在actor的并行处理过程中,它的影响是巨大的。

【问题讨论】:

嗨 Kishore,你看到你的记忆在一段时间后被回收了吗? 感谢 Abhishek 的回复,是的,它是正确的,在时间间隙内存自动释放后。 【参考方案1】:

我们遇到了与您类似的问题,即 Actor Service 没有在 15 分钟内删除其声称的内存。

测试用例是这样的:

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

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

【讨论】:

以上是关于Service Fabric 运行时未从 Actor 服务实例回收未使用的内存的主要内容,如果未能解决你的问题,请参考以下文章

使用 ResponseEntity 时未从 Websphere 响应中返回 text/html 标头,在 Tomcat 中有效吗?

在类中初始化时未从设置中加载集合

按下按钮时未从数组中填充 UILabel

调用 Selector 方法时未从 Superview 中删除视图

为啥当我单击目标 c 中的按钮时未从 tableViewCell 获取文本字段数据?

Axios Intercept 在第一次调用时未从 localStorage 应用令牌