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 中有效吗?
调用 Selector 方法时未从 Superview 中删除视图