请原谅我的术语,因为我是 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 个参与者的实例/副本,当我在我们的虚拟机上时,没有任何负载,每个参与者的内存使用量小于 50mb。
当我运行以下 power shell 脚本来停止和启动服务(基本上是重新创建它),但没有重新创建应用程序时,我注意到相同的参与者将启动并且内存立即飙升至 140+ MB .
我的演员实现没有持久状态。
[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, 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 倍或更多,而应用程序的负载却没有增加。