service-fabric-actor - 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)]
在演员的并行处理期间,它的影响是巨大的。
解决方案
我们一直面临与您类似的问题,Actor Service 没有在 15 分钟内删除其声称的内存。
测试用例如下:
- 我们请求一个 Actor 并等待该 Actor 完成其执行。
- 声称的内存以 100 MB 为单位。
- 执行完成后,使用
DeleteActorAsync
您提到的 API 以编程方式删除 Actor。 - garbageCollection 设置也设置为 ActorGarbageCollectionSettings = new ActorGarbageCollectionSettings(10, 5)。
但在我们的例子中,整个内存至少在 30 分钟内被释放。这让我们认为这可能是因为几代人的 GC 收集。
推荐阅读
- javascript - 在渲染方法中无法识别 React js 状态对象
- java - 尝试与肥皂客户端通信时出现意外元素错误
- python - SQLAlchemy:分叉代码中的 automap_base
- ios - 如何将 tableView 标签传递给另一个 viewController 中的名称变量?
- c# - Xamarin Launcher.OpenAsync PDF FileUriExposedException
- yaml - 在 yml 文件中使用变量
- python - 如何在 tkinter 的消息框中显示在 shell 中打印的所有文本
- javascript - 按键计数数组对象的频率
- mysql - 如何获取主键集合中只有 1 列的表名
- python - 如何将mongomock与unittest python一起使用