问题描述
请原谅我的术语,因为我是 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 (将#修改为@)