Service fabric stateful 服务结构-参与者内存峰值
请原谅我的术语,因为我是新的服务面料。 我们有一个使用本地服务结构的3节点集群(例如,不在Azure中托管) 我有一个无状态服务,它从rabbitmq中提取消息,并将它们传递给参与者进行业务逻辑处理 当我们使用power shell创建应用程序和服务时,我们首先强制删除应用程序: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
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倍或更多,而应用程序的负载不会增加