Service fabric stateful 服务结构-参与者内存峰值

Service fabric stateful 服务结构-参与者内存峰值,service-fabric-stateful,service-fabric-actor,service-fabric-on-premises,Service Fabric Stateful,Service Fabric Actor,Service Fabric On Premises,请原谅我的术语,因为我是新的服务面料。 我们有一个使用本地服务结构的3节点集群(例如,不在Azure中托管) 我有一个无状态服务,它从rabbitmq中提取消息,并将它们传递给参与者进行业务逻辑处理 当我们使用power shell创建应用程序和服务时,我们首先强制删除应用程序: Remove-ServiceFabricApplication -ApplicationName $applicationName -Force 然后,我们使用名称/类型和映像版本创建一个新的service fabr

请原谅我的术语,因为我是新的服务面料。 我们有一个使用本地服务结构的3节点集群(例如,不在Azure中托管)

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

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

Remove-ServiceFabricApplication -ApplicationName $applicationName -Force
然后,我们使用名称/类型和映像版本创建一个新的service fabric应用程序

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

当我运行下面的powershell脚本来停止和启动一个服务(基本上是重新创建它),但不重新创建应用程序时,我注意到相同的参与者将启动,并且内存立即达到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时,我们从应用程序中的另一个micro服务检索配置(db连接字符串)和其他设置,所有这些都存储在autofac容器生成器中。 然后,为了让我们的演员一直在运行,我们执行以下操作:

// 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, 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);
            };
//基于参数获取配置
var envConfig=FabricConfigFactory.Build();
//IoC依赖项
var builder=AutofacBuilderFactory.Build(envConfig);
//添加兔子自动传真配置
RabbitAutofacBuilder.RegisterRabbitConfig(生成器);
ActorServiceSettings=new ActorServiceSettings()
{
ActorGarbageCollectionSettings=new ActorGarbageCollectionSettings(10,2)//如果参与者空闲10秒,则每2秒检查一次,然后将进行GC。
};
//注册结构服务
RegisterActor(null,null,null,settings,null);
//注册Autofac magic以获得服务结构支持。
builder.RegisterServiceFabricsSupport();
使用(var scope=builder.Build())
{
//阻止此主机进程终止,以使服务保持运行。
Thread.Sleep(Timeout.Infinite);
};
最后,我想帮助理解为什么在第一次创建应用程序时,内存使用似乎很好,但在删除/创建服务而不修改应用程序后,内存似乎会增加3倍或更多,而应用程序的负载不会增加