Gestion et détection des erreurs dans Azure Batch
Dans certains cas, vous devrez peut-être gérer les échecs des tâches et des applications dans votre solution Azure Batch. Cet article explique les différents types d’erreurs de Batch et comment résoudre les problèmes courants.
Codes d’erreur
Voici quelques types d’erreurs que vous pouvez voir en général dans Batch :
- Échecs de mise en réseau pour les requêtes qui n’ont jamais atteint Batch, ou lorsque la réponse de Batch n’a pas atteint le client dans le temps imparti.
- Erreurs de serveur internes. Ces erreurs ont une réponse HTTP avec code d’état
5xx
standard. - Erreurs liées à la limitation. Ces erreurs incluent des réponses HTTP avec code d’état
429
ou503
avec l’en-têteRetry-after
. - des erreurs
4xx
telles queAlreadyExists
etInvalidOperation
. Ces erreurs indiquent que la ressource n’est pas dans l’état correct pour la transition d’état.
Pour plus d’informations sur des codes d’erreur spécifiques, consultez État de Batch et codes d’erreur. Cette référence comprend des codes d’erreur pour l’API REST, le service Batch, les tâches de travail et leur planification.
Échecs d’application
Pendant l’exécution, une application peut produire une sortie de diagnostic. Vous pouvez utiliser cette sortie pour résoudre les problèmes. Le service Batch écrit des sorties et sorties d’erreur standard dans les fichiers stdout.txt et stderr.txt du répertoire de tâche sur le nœud de calcul. Pour plus d’informations, consultez Fichiers et répertoires dans Batch.
Vous pouvez utiliser le portail Azure ou l’un des Kits de développement logiciel (SDK) Batch pour télécharger ces fichiers de sortie. Par exemple, vous pouvez récupérer ces fichiers et d’autres à des fins de résolution des problèmes en utilisant ComputeNode.GetNodeFile et CloudTask.GetNodeFile dans la bibliothèque .NET Batch.
Erreurs de tâche
Les erreurs de tâche se répartissent en plusieurs catégories.
Erreurs de prétraitement
Si une tâche ne parvient pas à démarrer, une erreur de prétraitement est définie pour la tâche. Des erreurs de prétraitement peuvent se produire si :
- Les fichiers de ressources de la tâche ont été déplacés.
- Le compte de stockage n’est plus disponible.
- Un autre problème s’est produit et a empêché la copie des fichiers sur le nœud.
Erreurs de chargement du fichier
Si le chargement des fichiers que vous spécifiez pour une tâche échoue pour une raison quelconque, une erreur de chargement du fichier est définie pour la tâche. Des erreurs de chargement de fichier peuvent se produire dans les cas suivants :
- Le jeton de signature d’accès partagé (SAS) fourni pour l’accès au Stockage Azure n’est pas valide.
- Le jeton SAS ne fournit pas d’autorisations en écriture.
- Le compte de stockage n’est plus disponible.
- Un autre problème s’est produit et a empêché la copie des fichiers depuis le nœud.
Erreurs d’application
Le processus spécifié par la ligne de commande de la tâche peut également échouer. Pour en savoir plus, consultez la section relative aux Codes de sortie de tâche.
Pour les erreurs d’application, configurez Batch pour relancer automatiquement la tâche autant de fois que vous l’aurez spécifié.
Erreurs de contrainte
Pour spécifier la durée d’exécution maximale d’un travail ou d’une tâche, définissez la contrainte maxWallClockTime
. Utilisez ce paramètre pour mettre fin aux tâches dont la progression échoue.
Lorsque la tâche dépasse la durée maximale :
- La tâche est marquée comme terminée.
- Le code de sortie est défini sur
0xC000013A
. - Le champ schedulingError est marqué comme
{ category:"ServerError", code="TaskEnded"}
.
Codes de sortie de tâche
Lorsqu’une tâche exécute un processus, Batch remplit la propriété de code de sortie de la tâche avec le code de retour du processus. Si le processus retourne un code de sortie différent de zéro, le service Batch marque la tâche comme ayant échoué.
Le service Batch ne détermine pas le code de sortie d’une tâche. Le processus lui-même, ou le système d’exploitation sur lequel le processus s’exécute, détermine le code de sortie.
Échecs ou interruptions de tâche
Les tâches peuvent parfois échouer ou être interrompues. Par exemple :
- L’application de la tâche elle-même peut échouer.
- Le nœud sur lequel la tâche s’exécute peut redémarrer.
- Une opération de redimensionnement peut supprimer le nœud du pool. Cette action peut se produire si la stratégie de désallocation du pool supprime immédiatement les nœuds sans attendre la fin des tâches.
Dans tous les cas, Batch peut remettre automatiquement la tâche en file d’attente pour l’exécuter sur un autre nœud.
Un problème intermittent peut également provoquer la non-réponse soudaine d’une tâche ou ralentir son exécution. Vous pouvez définir un intervalle d’exécution maximal d’une tâche. Si une tâche dépasse l’intervalle, le service Batch interrompt l’application de la tâche.
Connexion aux nœuds de calcul
Vous pouvez effectuer des actions de débogage et de résolution des problèmes en vous connectant à un nœud de calcul à distance. Utilisez le portail Azure pour télécharger un fichier RDP pour les nœuds Windows et obtenir des informations de connexion SSH pour les nœuds Linux. Vous pouvez également télécharger ces informations à l’aide des API Batch .NET ou Batch Python.
Pour vous connecter à un nœud via RDP ou SSH, créez d’abord un utilisateur sur le nœud. Appliquez l'une des méthodes suivantes :
- Portail Azure
- API REST Batch : adduser
- API .NET Batch : ComputeNode.CreateComputeNodeUser
- Module Batch Python : add_user
Si nécessaire, configurez ou désactivez l’accès aux nœuds de calcul.
Résolution des problèmes liés aux nœuds
Votre service ou application cliente Batch peut examiner les métadonnées des tâches ayant échoué pour identifier un nœud problématique. Chaque nœud d’un pool a un ID unique. Les métadonnées de tâche incluent le nœud dans lequel une tâche est exécutée. Une fois que vous avez trouvé le nœud problématique, essayez les méthodes suivantes pour résoudre l’échec.
Redémarrer le nœud
Le redémarrage d’un nœud résout parfois les problèmes latents, comme les processus bloqués ou ayant planté. Si votre pool utilise une tâche de démarrage ou si votre travail utilise une tâche de préparation, ces tâches s’exécutent au redémarrage du nœud.
- API REST Batch : redémarrage
- API .NET Batch : ComputeNode.Reboot
Réimager le nœud
La réinitialisation d’un nœud réinstalle le système d’exploitation. Les tâches de démarrage et celles de préparation du travail s’exécutent à nouveau après la recréation de l’image.
- API REST Batch : réinitialiser
- API .NET Batch : ComputeNode.Reimage
Supprimer un nœud du pool
La suppression du nœud du pool est parfois nécessaire.
- API REST Batch : removenodes
- API .NET Batch : PoolOperations
Désactiver la planification des tâches sur le nœud
La désactivation de la planification des tâches sur un nœud met le nœud hors connexion. Batch n’affecte aucune autre tâche au nœud. Toutefois, le nœud continue de s’exécuter dans le pool. Vous pouvez ensuite examiner plus en détail les échecs sans perdre les données de la tâche qui a échoué. Le nœud, par ailleurs, n’entraînera plus d’échecs de tâche.
Par exemple, désactivez la planification des tâches sur le nœud. Ensuite, connectez-vous au nœud à distance. Examinez les journaux des événements et effectuez d’autres procédures de dépannage. Une fois les problèmes résolus, réactivez la planification des tâches pour remettre le nœud en ligne.
- API REST Batch : enablescheduling
- API .NET Batch : ComputeNode.EnableScheduling
Vous pouvez utiliser ces actions pour spécifier les tâches Batch en cours d’exécution sur le nœud. Par exemple, lorsque vous désactivez la planification des tâches avec l’API .NET Batch, vous pouvez spécifier une valeur d’énumération pour DisableComputeNodeSchedulingOption. Vous pouvez choisir de :
- Terminer les tâches en cours d’exécution :
Terminate
- Remettre les tâches en file d’attente pour la planification sur d’autres nœuds :
Requeue
- Autoriser la fin des tâches en cours d’exécution avant d’effectuer l’action :
TaskCompletion
Nouvelle tentative après erreur
Les API Batch vous informent des échecs. Vous pouvez réessayer toutes les API à l’aide du gestionnaire de nouvelles tentatives global intégré. Il est recommandé d’utiliser cette option.
Après une défaillance, patientez quelques secondes avant de réessayer. Si vous réessayez trop souvent ou trop rapidement, le gestionnaire de nouvelles tentatives limite la bande passante.