Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Importante
Il supporto terminerà per il modello in-process il 10 novembre 2026. È consigliabile eseguire la migrazione delle app al modello di lavoro isolato per il supporto completo.
Questo articolo illustra come risolvere gli scenari comuni nelle app Durable Functions. Trovare il sintomo nell'elenco seguente e seguire i passaggi collegati per diagnosticare e risolvere il problema.
Sintomi comuni
- L'orchestrazione è bloccata nello stato In sospeso
- Le orchestrazioni iniziano dopo un lungo ritardo
- L'orchestrazione è bloccata nello stato In esecuzione
- Il completamento dell'orchestrazione richiede più tempo del previsto
- L'uso della memoria aumenta durante il debug
- Errori di connessione nel piano A consumo
Per le query di diagnostica KQL che è possibile eseguire in Application Insights, vedere Esempi di query KQL per la diagnostica delle Durable Functions.
L'orchestrazione è bloccata nello stato di Pending
Quando si avvia un'orchestrazione, un messaggio "start" viene scritto in una coda interna gestita dall'estensione Durable e lo stato dell'orchestrazione è impostato su "In sospeso". Dopo che un'istanza dell'app disponibile riprende ed elabora correttamente il messaggio di orchestrazione, lo stato passa a "In esecuzione" (o a un altro stato non in sospeso).
Seguire questa procedura per risolvere i problemi relativi alle istanze di orchestrazione che rimangono bloccate per un tempo indefinito nello stato "In sospeso".
Controllare le tracce di Durable Task Framework per la presenza di avvisi o errori per l'ID istanza di orchestrazione interessata. Usare la query Traccia errori e avvisi in Application Insights per cercare gli errori correlati all'istanza.
Controllare le code di controllo di Archiviazione di Azure per verificare se il "messaggio di avvio" dell'orchestrazione è ancora presente nella coda. Nel portale di Azure, vai al tuo account di archiviazione, seleziona Code e cerca le code con un prefisso
control. Per informazioni sul funzionamento delle code di controllo, vedere la documentazione relativa alla coda di controllo del provider Archiviazione di Azure.Modificare la configurazione della piattaforma dell'app in 64 bit. L'avvio delle orchestrazioni a volte non riesce perché l'app esaurisce la memoria. Il passaggio a un processo a 64 bit consente all'app di allocare più memoria totale. Questa modifica si applica solo ai piani Basic, Standard, Premium e Elastic Premium del servizio app. I piani gratuito o a consumo non supportano processi a 64 bit.
Le orchestrazioni iniziano dopo un lungo ritardo
In genere, le orchestrazioni iniziano entro pochi secondi dopo la pianificazione. Tuttavia, l'avvio delle orchestrazioni potrebbe richiedere più tempo in determinati casi. Per risolvere i problemi relativi alle orchestrazioni che impiegano più di qualche secondo per iniziare l'esecuzione, seguire questi passaggi.
Controllare se il ritardo corrisponde a una limitazione nota del provider di Archiviazione di Azure, ad esempio il ribilanciamento delle partizioni o gli intervalli di polling basati su timer.
Controllare le tracce del Durable Task Framework per individuare eventuali avvisi o errori relativi all'ID dell'istanza di orchestrazione interessata. Usare la query Traccia errori e avvisi in Application Insights per cercare gli errori correlati all'istanza.
L'orchestrazione è bloccata nello stato di Running
Se lo stato dell'orchestrazione risulta "In esecuzione" per più tempo del previsto o se sembra aver smesso di fare progressi, è probabile che l'orchestrazione sia in attesa di un'attività che non è stata completata. Ad esempio, potrebbe essere in attesa di un timer durevole, un compito, o un evento esterno. Se le attività pianificate sono state completate correttamente, ma l'orchestrazione non avanza ancora, potrebbe verificarsi un problema che impedisce di procedere al passaggio successivo. Le orchestrazioni in questo stato sono spesso chiamate "orchestrazioni bloccate".
Per risolvere i problemi relativi alle orchestrazioni bloccate, seguire questa procedura:
Provare a riavviare l'app delle funzioni. Questo passaggio può essere utile se l'orchestrazione si blocca a causa di un bug temporaneo o di un deadlock nell'app o nel codice di estensione.
Controllare le code di controllo dell'account di archiviazione di Azure per verificare se alcune code aumentano continuamente. Usare la query di messaggistica di Archiviazione di Azure in Application Insights per identificare i problemi relativi alla rimozione della coda dei messaggi di orchestrazione. Se il problema interessa solo una singola coda di controllo, potrebbe indicare un problema in un'istanza specifica dell'app. In tal caso, aumentare o ridurre le risorse per spostarsi dall'istanza di macchina virtuale non integra potrebbe essere utile.
Filtrare i risultati della query di messaggistica di Archiviazione di Azure in base al nome della coda come ID Partizione per cercare i problemi correlati a quella specifica partizione della coda di controllo.
Controllare la documentazione sul versionamento di Durable Functions. Le modifiche importanti alle istanze di orchestrazione in corso possono causare il blocco delle orchestrazioni.
Il completamento dell'orchestrazione richiede più tempo del previsto
L'elaborazione dei dati intensa, gli errori interni e le risorse di calcolo insufficienti possono causare l'esecuzione delle orchestrazioni più lente del normale. Per risolvere i problemi relativi alle orchestrazioni che richiedono più tempo del previsto, seguire questa procedura:
Controllare le tracce di Durable Task Framework per la presenza di avvisi o errori per l'ID istanza di orchestrazione interessata. Usare la query Traccia errori e avvisi in Application Insights per cercare gli errori correlati all'istanza.
Se l'app usa il modello in-process .NET, è consigliabile abilitare sessioni estese. Le sessioni estese riducono al minimo i caricamenti della cronologia, che possono rallentare l'elaborazione.
Verificare la presenza di colli di bottiglia in relazione a prestazioni e scalabilità. Un utilizzo elevato della CPU o un utilizzo elevato della memoria può causare ritardi. Per una guida dettagliata, vedere Prestazioni e scalabilità in Durable Functions.
L'uso della memoria aumenta durante il debug
Se un'app .NET Durable Functions utilizza sempre più memoria mentre gira con un debugger gestito collegato, la crescita potrebbe essere causata dal debugger piuttosto che dalla tua app o dal runtime Durable Functions.
Ogni volta che una funzione di orchestrazione viene rieseguita, ricrea le attività che l'orchestrazione attende. Alcuni di questi compiti non si completano mai, perché la replica termina non appena l'orchestratore raggiunge un lavoro che non è ancora nella storia. Quando si collega un debugger gestito, il runtime .NET traccia compiti asincroni incompleti, così che funzioni del debugger come gli stack di chiamate asincrone funzionino. Questo monitoraggio mantiene in memoria le attività rieseguite, pertanto il consumo di memoria può aumentare progressivamente durante una lunga sessione di debug e causare infine un errore di memoria insufficiente. Le orchestrazioni che si estendono su molti compiti o durano ore possono mostrare la crescita maggiore.
Importante
La crescita di memoria che avviene solo quando un debugger è collegato non indica di per sé che la tua app perda memoria durante le run di produzione, dove non è collegato alcun debugger.
Segui questi passaggi per risolvere l'aumento dell'uso di memoria nelle sessioni di debug:
Riprodurre il comportamento senza un debugger gestito collegato. In Visual Studio, seleziona Debug>Start Without Debugging oppure avvia l'app da un prompt dei comandi usando
func host start. Fai lo stesso per i test di carico. Se usi un profiler di memoria, scegli una configurazione di profiling che non collega il debugger gestito. Se l'uso di memoria è stabile in queste esecuzioni, la crescita è specifica per il debug e la tua app non ha bisogno di una modifica al codice.Riavvia le lunghe sessioni di debug quando il consumo di memoria diventa troppo alto. Riavviare libera i compiti che il debugger conserva.
Se la tua app utilizza il modello .NET in processo con il provider Archiviazione di Azure, puoi abilitare sessioni estese per ridurre la frequenza con cui gli orchestratori riproducono, il che potrebbe ridurre questa crescita. Le sessioni estese non sono una soluzione generale a questo comportamento, non sono disponibili nel modello di worker isolato e possono aumentare l'uso normale della memoria della tua app, quindi non abilitarle solo per questo motivo.
Se l'uso della memoria aumenta anche nelle esecuzioni senza un debugger collegato, trattalo come un problema separato e indaga la dimensione della cronologia dell'orchestrazione, le dimensioni dei payload di input e output e le impostazioni di concorrenza. Per maggiori informazioni, vedere Prestazioni e scalabilità in Durable Functions.
Questo comportamento viene monitorato nell'issue di GitHub Azure/azure-functions-durable-extension#340.
Esempi di query KQL per la diagnostica delle Durable Functions
Risolvere i problemi scrivendo query personalizzate KQL nell'istanza di applicazione Azure Insights configurata per l'app Funzioni di Azure. Per le definizioni di colonna usate in queste query, vedere il riferimento alla colonna.
Archiviazione di Azure messaggistica
Quando si usa il provider di Archiviazione di Azure predefinito, tutto il comportamento Durable Functions è basato sui messaggi della coda Archiviazione di Azure e tutto lo stato correlato a un'orchestrazione viene archiviato nell'archiviazione tabelle e nell'archiviazione BLOB. Quando si abilita la traccia di Durable Task Framework, tutte le interazioni Archiviazione di Azure vengono registrate in Application Insights. Questi dati sono importanti per il debug di problemi di esecuzione e prestazioni.
A partire dalla versione 2.3.0 dell'estensione Durable Functions, è possibile pubblicare questi log di Durable Task Framework nell'istanza di Application Insights aggiornando la configurazione di registrazione nel file host.json. Per altre informazioni, vedere l'articolo Registrazione di Durable Task Framework.
La query seguente esamina le interazioni end-to-end Archiviazione di Azure per un'istanza di orchestrazione specifica. Modifica start e orchestrationInstanceID per filtrare in base all'intervallo di tempo e all'ID istanza.
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
Errori di traccia e avvisi
La query seguente cerca errori e avvisi per una determinata istanza di orchestrazione. Specificare un valore per 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
Log coda di controllo e ID partizione
La query seguente cerca tutte le attività associate alla coda di controllo instanceId. Specificare il valore per instanceID in orchestrationInstanceID e l'ora di inizio della query in 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
Riferimenti alle colonne di Application Insights per le query di Durable Functions
Nella tabella seguente sono elencate le colonne proiettate dalle query precedenti e dalle relative descrizioni.
| Column | Description |
|---|---|
| pid | ID processo dell'istanza dell'app per le funzioni. Tale valore è utile per verificare se il processo è stato riciclato durante l'esecuzione di un'orchestrazione. |
| nomeAttività | Nome dell'evento registrato. |
| eventType | Il tipo di messaggio, che di solito rappresenta il lavoro svolto da un orchestratore. Per un elenco completo dei valori possibili e delle relative descrizioni, vedere EventType.cs. |
| extendedSession | Valore booleano che indica se le sessioni estese sono abilitate. |
| Account | Account di archiviazione usato dall'app. |
| details | Informazioni aggiuntive su un evento specifico, se disponibile. |
| instanceId | ID per una determinata orchestrazione o istanza di entità. |
| ID messaggio | ID univoco di Archiviazione di Azure per un determinato messaggio della coda. Questo valore viene più comunemente visualizzato negli eventi di traccia ReceivedMessage, ProcessingMessage ed DeletingMessage. Questo valore non è presente negli eventi SendingMessage perché l'ID del messaggio viene generato da Archiviazione di Azure after il messaggio viene inviato. |
| ID di esecuzione | ID dell'esecuzione dell'agente di orchestrazione, che cambia a ogni richiamo di continue-as-new. |
| età | Numero di millisecondi da quando un messaggio è stato messo in coda. Un numero elevato spesso indica problemi di prestazioni. Un'eccezione è il tipo di messaggio TimerFired, che potrebbe avere un valore di validità elevato a seconda della durata del timer. |
| latencyMs | Numero di millisecondi impiegato da un'operazione di archiviazione. |
| dequeueCount | Numero di volte in cui un messaggio è rimosso dalla coda. In circostanze normali, questo valore è sempre 1. Se sono più di uno, potrebbe esserci un problema. |
| ID di partizione | Nome della coda associata a questo log. |
| conteggio totale eventi | Numero di eventi di cronologia coinvolti nell'azione corrente. |
| taskHub | ** Nome dell'hub delle attività. |
| nuoviEventi | Elenco delimitato da virgole di eventi della cronologia scritti nella tabella Cronologia nell'archiviazione. |
Problemi di gestione delle connessioni nel piano A consumo
Le app in esecuzione nel piano a consumo di Funzioni di Azure sono soggette a limiti di connessione. I sintomi comuni includono:
- Errori di connettività intermittenti quando si chiamano funzioni di attività o servizi esterni.
- Orchestrazioni che falliscono sporadicamente sotto carico di lavoro.
- Errori di esaurimento dei socket nei log.
Per ridurre l'utilizzo della connessione, usare HttpClientFactory o condividere client statici invece di creare nuove HttpClient istanze in ogni chiamata di funzione. Per indicazioni dettagliate sul pool di connessioni e sulle procedure consigliate, vedere Gestire le connessioni in Funzioni di Azure.
Suggerimenti generali
Tip
Prima di approfondire specifici passaggi per la risoluzione dei problemi, assicurarsi che l'app usi la versione più recente dell'estensione Durable Functions. Nella maggior parte dei casi, l'uso della versione più recente riduce i problemi noti già segnalati da altri utenti. Per istruzioni su come effettuare l'aggiornamento, vedere aggiorna la versione di estensione di Durable Functions.
La scheda Diagnose e risolvere i problemi nel portale di Azure consente di monitorare e diagnosticare i problemi relativi all'applicazione e suggerire potenziali soluzioni. Per altre informazioni, vedere diagnostica dell'app di Azure Functions.
Ottenere supporto per i problemi di Durable Functions
Se non è possibile risolvere il problema usando questa guida, è possibile inviare un ticket di supporto aprendo la sezione Nuova richiesta di supporto nel pannello Support + troubleshooting della pagina dell'app per le funzioni nel portale Azure.
Per domande e supporto della community, aprire un problema in uno dei GitHub repository seguenti. Quando si segnala un bug, includere informazioni come GLI ID istanza interessati, gli intervalli di tempo in formato UTC che mostrano il problema, il nome dell'applicazione (se possibile) e l'area di distribuzione per velocizzare le indagini.