当我在ServiceFabric群集上使用EventFlow监听ETW事件时,“系统资源不足”

时间:2018-07-17 08:56:03

标签: c# asp.net-core azure-service-fabric etw event-flow

我有一个在Service Fabric上运行的使用EventFlow的ETW侦听器。

这是我的配置文件(eventFlowConfig.json):

{
  "inputs": [
    {
      "type": "ETW",
      "sessionNamePrefix": "MyListenerService",
      "cleanupOldSessions": true,
      "reuseExistingSession": true,
      "providers": [
        {
          "providerName": "Provider0"
        }
      ]
    }
  ],
  "filters": [],
  "outputs": [
    {
      "type": "CustomOutput"
    }
  ],
  "schemaVersion": "2018-04-04",

  "extensions": [
    {
      "category": "outputFactory",
      "type": "CustomOutput",
      "qualifiedTypeName": "MyNamespace.EventFlow.Outputs.CustomOutputFactory, MyAssembly"
    }
  ]
}

这是我的切入点:

private static void Main()
{
    try
    {
        string configurationFileName = "eventFlowConfig.json";

        using (var diagnosticsPipeline = ServiceFabricDiagnosticPipelineFactory.CreatePipeline("MyService", configurationFileName))
        {
            ServiceRuntime.RegisterServiceAsync("MyServiceType",
                context => new Service(context)).GetAwaiter().GetResult();

            ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Service).Name);
            // Prevents this host process from terminating so services keeps running. 
            Thread.Sleep(Timeout.Infinite);
        }
    }
    catch (Exception e)
    {
        ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
        throw;
    }
}

当我在调试时在本地集群中多次启动/停止服务时,出现此异常:

System.Runtime.InteropServices.COMException: 'Insufficient system resources exist to complete the requested service. (Exception from HRESULT: 0x800705AA)'

在重新启动计算机之前,我无法重新启动服务。问题是我在本地环境以外的其他环境中遇到了同样的异常。

我已经尝试过:TraceEventSession usage in ServiceFabric application raises insufficient resource error:我的服务是无状态的,并且每个节点只有一个实例。

此配置是否不足以释放/重用ETW会话?

"sessionNamePrefix": "MyListenerService",
"cleanupOldSessions": true,
"reuseExistingSession": true,

还有其他人遇到过这个问题吗?

修改 在@Diego Mendes回答之后,我执行了logman -ets

...
EventFlow-EtwInput-a8aefb3c-594f-4ac7-b9d8-6da1791fb122 Trace                         Running
EventFlow-EtwInput-fe5f58e6-d1a7-4198-95b2-d343584cf46b Trace                         Running
EventFlow-EtwInput-33f67287-5563-4835-b3a1-5527e4fc5e5e Trace                         Running
EventFlow-EtwInput-959eef04-a5ae-47eb-9b7e-057a9fd3fb28 Trace                         Running
EventFlow-EtwInput-0095f186-d657-4974-a613-213d7eb49def Trace                         Running
EventFlow-EtwInput-8fbc52f5-2de6-4826-bce2-36d8abf0c264 Trace                         Running
EventFlow-EtwInput-8e654b40-c299-48f4-818e-5ebe3c2341a4 Trace                         Running
EventFlow-EtwInput-7ec63ec9-428b-4658-b059-698b5ae66986 Trace                         Running

EventFlow忽略了我的sessionNamePrefix并被EventFlow-EtwInput覆盖了吗?可能是EventFlow的错误吗?

我将尝试使用EventFlow-EtwInput作为我的sessionNamePrefix

2 个答案:

答案 0 :(得分:3)

正如您所指出的,之所以发生是因为您多次启动和停止服务。每次启动服务时,都会创建一个新会话,当您在“调试”模式下运行该会话时,调试器会在关闭活动会话之前终止该进程。

您从马特答案中链接了

  

Windows最多可以运行64个ETW会话   同时。考虑使用在每个设备上运行的单个无状态应用程序   节点以创建单个会话。

您可以通过运行以下命令来检查何时再次发生会话:

logman -ets

它将列出所有活动的会话,您的会话可能会显示为以下内容:

MyListenerService-A402EE30-53B7-48E4-B602-76B101C0AB97

如果您有多个活动会话,那是因为它没有正确关闭,也没有重用旧会话。

在配置中,设置时:

  

cleanupOldSessions :如果设置为TRUE,则现有的ETW跟踪会话   匹配sessionNamePrefix的将被关闭。这有助于收集   剩余会话实例,因为它们的数量受到限制。

     

reuseExistingSession :如果启用,则现有跟踪会话   匹配sessionNamePrefix的将被重用。如果cleanupOldSessions   也会打开,那么它将保留一个会话供重用。

从您的设置中,您同时使用两种设置,我会尝试调整这些值以查看是否可以解决问题。

答案 1 :(得分:0)

添加到这个答案中,因为我遇到了同样的错误。

  1. 使用列出所有活动会话

logman -ets

  1. 对于所有活动会话,请执行以下停止命令

logman stop“ MyListenerService-A402EE30-53B7-48E4-B602-76B101C0AB97” -ets

它帮助我继续执行代码。