Поделиться через


Руководство по устранению неполадок Устойчивые функции

Устойчивые функции — это расширение Функции Azure, которое позволяет создавать бессерверные оркестрации с помощью обычного кода. Дополнительные сведения о Устойчивые функции см. в обзоре Устойчивые функции.

Эта статья содержит руководство по устранению неполадок в распространенных сценариях в приложениях Устойчивые функции.

Примечание

Специалисты службы поддержки Майкрософт могут помочь в диагностике проблем с вашим приложением. Если вы не можете диагностировать проблему с помощью этого руководства, вы можете отправить запрос в службу поддержки, перейдя в колонку Новый запрос в службу поддержки в разделе Поддержка и устранение неполадок на странице приложения-функции в портал Azure.

Снимок экрана: страница запроса на поддержку на портале Azure.

Совет

При отладке и диагностике проблем рекомендуется сначала убедиться, что приложение использует последнюю версию расширения Устойчивые функции. В большинстве случаев использование последней версии устраняет известные проблемы, о которые уже сообщили другие пользователи. Инструкции по обновлению версии расширения см. в статье Обновление версии расширения Устойчивые функции.

Вкладка Диагностика и решение проблем в портал Azure — полезный ресурс для мониторинга и диагностики возможных проблем, связанных с приложением. Он также предоставляет потенциальные решения ваших проблем на основе диагноза. Дополнительные сведения см. в статье Диагностика приложения-функции Azure.

Если приведенные выше ресурсы не помогли решить вашу проблему, в следующих разделах приведены рекомендации по конкретным симптомам приложения.

Оркестрация зависла в Pending состоянии

При запуске оркестрации сообщение "start" записывается во внутреннюю очередь, управляемую расширением Durable, а состояние оркестрации получает значение "Ожидание". После того как сообщение оркестрации будет выбрано и успешно обработано доступным экземпляром приложения, состояние переключится на "Выполняется" (или в другое состояние, отличное от "Ожидание").

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

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

  • Проверьте очереди элементов управления службы хранилища Azure, назначенные зависавшим оркестратору, чтобы узнать, существует ли его "сообщение о запуске". Дополнительные сведения об очередях управления см. в документации по очереди управления поставщика службы хранилища Azure.

  • Измените версию конфигурации платформы приложения на "64-разрядную". Иногда оркестрации не запускались из-за нехватки памяти в приложении. Переключение на 64-разрядный процесс позволяет приложению выделять больше памяти. Это относится только к Служба приложений планам "Базовый", "Стандартный", "Премиум" и "Эластичный премиум". Планы "Бесплатный" и "Потребление" не поддерживают 64-разрядные процессы.

Оркестрация запускается после длительной задержки

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

Оркестрация не завершена или зависла в Running состоянии

Если оркестрация остается в состоянии "Выполняется" в течение длительного периода времени, обычно это означает, что она ожидает длительной задачи, которая запланирована для завершения. Например, он может ожидать завершения задачи устойчивого таймера, задачи действия или внешней задачи события. Однако если вы заметили, что запланированные задачи успешно завершены, но оркестрация по-прежнему не выполняется, может возникнуть проблема, препятствующая переходу оркестрации к следующей задаче. Мы часто называем оркестрации в этом состоянии "зависавшим оркестрациям".

Чтобы устранить зависание оркестрации, выполните следующие действия.

  • Попробуйте перезапустить приложение-функцию. Этот шаг может помочь, если оркестрация зависает из-за временной ошибки или взаимоблокировки в приложении или коде расширения.

  • Проверьте очереди управления учетной записью службы хранилища Azure, чтобы узнать, постоянно ли растут какие-либо очереди. Этот запрос KQL для обмена сообщениями службы хранилища Azure может помочь выявить проблемы с выводом из очереди сообщений оркестрации. Если проблема затрагивает только одну очередь элементов управления, это может указывать на проблему, которая существует только в определенном экземпляре приложения. В этом случае увеличение или уменьшение масштаба для перемещения неработоспособного экземпляра виртуальной машины может помочь.

  • Используйте запрос Application Insights в разделе Обмена сообщениями службы хранилища Azure , чтобы отфильтровать имя очереди в качестве идентификатора секции и найти проблемы, связанные с этой секцией управляющей очереди.

  • Ознакомьтесь с рекомендациями в Устойчивые функции рекомендации и средства диагностики. Некоторые проблемы могут быть вызваны известными Устойчивые функции антишаблоны.

  • Ознакомьтесь с документацией по Устойчивые функции управления версиями. Некоторые проблемы могут быть вызваны критическими изменениями в экземплярах оркестрации в режиме выполнения.

Оркестрация выполняется медленно

При интенсивной обработке данных, внутренних ошибках и нехватке вычислительных ресурсов оркестрация выполняется медленнее, чем обычно. Выполните следующие действия для устранения неполадок оркестрации, выполнение которых занимает больше времени, чем ожидалось:

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

  • Если приложение использует внутрипроцессную модель .NET, рассмотрите возможность включения расширенных сеансов. Расширенные сеансы могут свести к минимуму нагрузку на журнал, что может замедлить обработку.

  • Проверьте наличие узких мест производительности и масштабируемости. Производительность приложения зависит от многих факторов. Например, высокая загрузка ЦП или большое потребление памяти могут привести к задержкам. Подробные рекомендации см. в статье Производительность и масштабирование в Устойчивые функции.

Примеры запросов

В этом разделе показано, как устранять неполадки путем написания пользовательских запросов KQL в экземпляре приложение Azure Insights, настроенном для приложения Функции Azure.

Обмен сообщениями в службе хранилища Azure

При использовании поставщика службы хранилища Azure по умолчанию все Устойчивые функции поведение определяется сообщениями очереди службы хранилища Azure, а все состояния, связанные с оркестрацией, хранятся в хранилище таблиц и хранилище BLOB-объектов. Если трассировка платформы устойчивых задач включена, все взаимодействия со службой хранилища Azure регистрируются в Application Insights, и эти данные критически важны для отладки проблем с выполнением и производительностью.

Начиная с версии 2.3.0 расширения Устойчивые функции эти журналы платформы устойчивых задач можно публиковать в экземпляре Application Insights, обновив конфигурацию ведения журнала в файле host.json. Сведения и инструкции о том, как это сделать, см. в статье Ведение журнала платформы устойчивых задач .

Следующий запрос предназначен для проверки сквозного взаимодействия со службой хранилища Azure для конкретного экземпляра оркестрации. Измените start и orchestrationInstanceID для фильтрации по диапазону времени и идентификатору экземпляра.

let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this 
let orchestrationInstanceID = "XXXXXXX"; //edit this
traces  
| where timestamp > start and timestamp < start + 1h 
| where customDimensions.Category == "DurableTask.AzureStorage" 
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"] 
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"] 
| extend details = customDimensions["prop__Details"] 
| extend instanceId = customDimensions["prop__InstanceId"] 
| extend messageId = customDimensions["prop__MessageId"] 
| extend executionId = customDimensions["prop__ExecutionId"] 
| extend age = customDimensions["prop__Age"] 
| extend latencyMs = customDimensions["prop__LatencyMs"] 
| extend dequeueCount = customDimensions["prop__DequeueCount"] 
| extend partitionId = customDimensions["prop__PartitionId"] 
| extend eventCount = customDimensions["prop__TotalEventCount"] 
| extend taskHub = customDimensions["prop__TaskHub"] 
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
| where instanceId == orchestrationInstanceID
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion

Ошибки и предупреждения трассировки

Следующий запрос ищет ошибки и предупреждения для заданного экземпляра оркестрации. Необходимо указать значение для orchestrationInstanceID.

let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX); 
traces  
| where timestamp > start and timestamp < start + 1h
| extend instanceId = iif(isnull(customDimensions["prop__InstanceId"] ) , customDimensions["prop__instanceId"], customDimensions["prop__InstanceId"] ) 
| extend logLevel = customDimensions["LogLevel"]
| extend functionName = customDimensions["prop__functionName"]
| extend status = customDimensions["prop__status"]
| extend details = customDimensions["prop__Details"] 
| extend reason = customDimensions["prop__reason"]
| where severityLevel > 1 // to see all logs of  severity level "Information" or greater.
| where instanceId == orchestrationInstanceID
| sort by timestamp asc 

Управление журналами очередей и идентификаторов секций

Следующий запрос выполняет поиск всех действий, связанных с очередью управления instanceId. Необходимо указать значение instanceID в и orchestrationInstanceID время начала запроса в start.

let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this
traces  // determine control queue for this orchestrator
| where timestamp > start and timestamp < start + 1h 
| extend instanceId = customDimensions["prop__TargetInstanceId"] 
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| where partitionId contains "control" 
| where instanceId == orchestrationInstanceID
| join kind = rightsemi(
traces  
| where timestamp > start and timestamp < start + 1h 
| where customDimensions.Category == "DurableTask.AzureStorage" 
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"] 
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"] 
| extend details = customDimensions["prop__Details"] 
| extend instanceId = customDimensions["prop__InstanceId"] 
| extend messageId = customDimensions["prop__MessageId"] 
| extend executionId = customDimensions["prop__ExecutionId"] 
| extend age = customDimensions["prop__Age"] 
| extend latencyMs = customDimensions["prop__LatencyMs"] 
| extend dequeueCount = customDimensions["prop__DequeueCount"] 
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| extend eventCount = customDimensions["prop__TotalEventCount"] 
| extend taskHub = customDimensions["prop__TaskHub"] 
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
) on partitionId
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion

Справочник по столбцам Application Insights

Ниже приведен список столбцов, проецируемых запросами выше, и их соответствующие описания.

Столбец Описание
pid Идентификатор процесса экземпляра приложения-функции. Это полезно для определения того, был ли процесс переработан во время выполнения оркестрации.
taskName Имя регистрируемого события.
eventType Тип сообщения, который обычно представляет работу, выполненную оркестратором. Полный список возможных значений и их описание приведены здесь.
extendedSession Логическое значение, указывающее, включены ли расширенные сеансы .
account Учетная запись хранения, используемая приложением.
подробности Дополнительные сведения о конкретном событии, если они доступны.
instanceId Идентификатор для заданного экземпляра оркестрации или сущности.
messageId Уникальный идентификатор службы хранилища Azure для заданного сообщения очереди. Это значение чаще всего отображается в событиях трассировки ReceivedMessage, ProcessingMessage и DeletingMessage. Обратите внимание, что он не присутствует в событиях SendMessage, так как идентификатор сообщения создается службой хранилища Azure после отправки сообщения.
executionId Идентификатор выполнения оркестратора, который изменяется при каждом continue-as-new вызове.
age Число миллисекундах с момента постановки сообщения в очередь. Большое число часто указывает на проблемы с производительностью. Исключением является тип сообщения TimerFired, который может иметь большое значение Age в зависимости от длительности таймера.
LatencyMs Количество миллисекундах, затраченное операцией хранения.
dequeueCount. Количество раз, когда сообщение было выведено из очереди. В обычных условиях это значение всегда равно 1. Если их несколько, может возникнуть проблема.
partitionId Имя очереди, связанной с этим журналом.
totalEventCount Количество событий журнала, участвующих в текущем действии.
taskHub Имя центра задач.
newEvents Разделенный запятыми список событий журнала, записываемых в таблицу Журнал в хранилище.