"Недостаточно системных ресурсов" при прослушивании событий ETW с помощью EventFlow в кластере ServiceFabric

У меня есть слушатель ETW, использующий EventFlow на Service Fabric.

Это мой файл конфигурации (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 в приложении ServiceFabric вызывает недостаточную ошибку ресурса: мой сервис не имеет состояния и является только одним экземпляром на узел.

Разве этой конфигурации не должно быть достаточно для освобождения / повторного использования сеансов 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,

1 ответ

Решение

Как вы указали, это происходит потому, что вы запускаете и останавливаете свой сервис несколько раз. Каждый раз, когда вы запускаете службу, создается новый сеанс, когда вы делаете это в режиме отладки, отладчик завершает процесс, прежде чем он закрывает активные сеансы.

С ответом Мэтта вы связались:

Windows имеет ограничение в 64 сеанса ETW, которые могут выполняться одновременно. Рассмотрите возможность использования одного приложения без сохранения состояния на каждом узле для создания одного сеанса.

Вы можете проверить, когда это произойдет снова, если какие-либо сессии остаются открытыми, выполнив эту команду:

logman -ets

В нем будут перечислены все активные сеансы, ваш, скорее всего, будет отображаться примерно так:

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

если у вас активно несколько сессий, это потому, что он не закрывается должным образом, а также не использует старый сеанс повторно.

В конфигурации, когда вы установите:

cleanupOldSessions: если установлено значение TRUE, существующие сеансы трассировки ETW, соответствующие sessionNamePrefix, будут закрыты. Это помогает собирать оставшиеся экземпляры сеанса, поскольку существует ограничение на их количество.

reuseExistingSession: если этот параметр включен, существующий сеанс трассировки, соответствующий sessionNamePrefix, будет использоваться повторно. Если cleanupOldSessions также включен, то он оставит один сеанс открытым для повторного использования.

Из ваших настроек вы используете оба ON, я бы попробовал настроить эти значения, чтобы посмотреть, решит ли это проблему.

Просто добавляю к этому ответу, так как я получал ту же ошибку.

  1. Перечислите все активные сеансы, используя

логман -ets

  1. Для всех активных сессий выполните команду остановки, например

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

Это помогло мне продолжить работу с кодом.

Другие вопросы по тегам