Service Fabric - Actor 内存峰值

问题描述

请原谅我的术语,因为我是 Service Fabric 的新手。 我们有一个使用本地 Service Fabric 的 3 节点集群(例如,未托管在 Azure 中)。

我有一个无状态服务,它从 Rabbit MQ 中提取消息并将它们传递给一个参与者以进行我们的业务逻辑处理。

当我们使用 power shell 创建我们的应用程序和服务时,我们首先强制删除应用程序:

Remove-ServiceFabricApplication -ApplicationName $applicationName -Force

然后我们使用我们的名称/类型和图像版本创建一个新的服务结构应用程序。

New-ServiceFabricApplication `
-ApplicationName $applicationName `
-ApplicationTypeName $applicationType `
-ApplicationTypeVersion $version

最后,我们创建了我们的服务。

# Create Actor Service
$lowkey = "-9223372036854775808"
$highkey = "9223372036854775807" 

New-ServiceFabricService `
-ApplicationName $applicationName `
-ServiceTypeName 'AlarmsProcessingActorServiceType' `
-Stateful `
-ServiceName ($applicationName + '/AlarmsProcessingActorService') `
-PartitionSchemeUniformInt64 `
-HasPersistedState `
-LowKey $lowkey `
-HighKey $highkey `
-PartitionCount $nodeCount `
-MinreplicasetSize 1 `
-TargetreplicasetSize 1 `
-ServicePackageActivationMode ExclusiveProcess

Start-Sleep -s 10

# Create Stateless Service
New-ServiceFabricService `
-ApplicationName $applicationName `
-ServiceName ($applicationName + '/AlarmsService') `
-ServiceTypeName 'AlarmsType' `
-InstanceCount 1 `
-Stateless `
-PartitionSchemeSingleton

所以我们在每个节点上创建了 5 个 actor 实例/副本,当我在我们的 VM 上时,没有任何负载,每个 actor 的内存使用量小于 50mb。

当我运行以下 power shell 脚本来停止和启动服务(基本上是重新创建它),但没有重新创建应用程序时,我注意到相同的 actor 将启动并且内存立即飙升至140+ MB。

我的 actor 实现没有持久化状态。

[StatePersistence(StatePersistence.None)]
public class AlarmsProcessingActor : Actor,IAlarmsProcessingActor

我们正在使用以下 NuGet 包

Autofac 5.2.0 Autofac.ServiceFabric 3.0.0 Microsoft.ServiceFabric.Actors 4.1.456

我们的集群正在运行代码版本:7.2.457.9590

我曾尝试获取内存转储,但我的知识不够丰富,无法对使用 winDBG 的人产生误解。我已经尝试使用 ANTS 内存分析器 11 进行分析,但我还是不知道我在看什么。

在我们的actor启动时,我们从应用程序中的另一个微服务中检索我们的配置(数据库连接字符串和其他设置),所有这些都存储在一个 autofac 容器构建器中。 然后为了让我们的 actor 一直运行,我们执行以下操作:

// Get config based on params
            var envConfig = FabricConfigFactory.Build();

            // IoC Dependencies
            var builder = AutofacBuilderFactory.Build(envConfig);

            // Add rabbit autofac config
            RabbitAutofacBuilder.RegisterRabbitConfig(builder);

            ActorServiceSettings settings = new ActorServiceSettings()
            {
                ActorGarbageCollectionSettings = new ActorGarbageCollectionSettings(10,2) //if the actor is idle for 10 seconds,checking every 2 seconds,then GC will take place.
            };

            // Register Fabric Services
            builder.Registeractor<AlarmsProcessingActor>(null,null,settings,null);

            // Register the Autofac magic for Service Fabric support.
            builder.RegisterServiceFabricSupport();

            using (var scope = builder.Build())
            {
                // Prevents this host process from terminating so services keep running.
                Thread.Sleep(Timeout.Infinite);
            };

最终,我想帮助理解为什么首次创建应用程序时,内存使用情况似乎很好,但是在删除/创建服务而不修改应用程序之后,内存似乎增加了 3 倍或更多,而没有负载应用增加

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...