Partager via


Le rôle AssemblyBinder instance lève l’exception System.IO.IOException

Cet article fournit des informations sur la résolution des problèmes dans lesquels le rôle AssemblyBinder instance de l’application Compressor est bloqué entre l’état Occupé et redémarrage et la levée d’une exception System.IO.IOException indiquant : Il n’y a pas suffisamment d’espace sur le disque.

Version du produit d’origine : Gestion des API Service
Numéro de la base de connaissances d’origine : 4464907

Remarque

Reportez-vous à l’article sur la série de résolution des problèmes des services cloud Azure. Il s’agit du deuxième scénario du labo. Vérifiez que vous avez suivi les instructions de configuration du labo pour l’application Compressor pour recréer le problème.

Symptômes

Le rôle AssemblyBinder instance de l’application Compressor lève l’exception non prise en charge ci-dessous dans le panneau Portail Azure et est bloqué entre l’état Occupé et l’état Redémarrage.

Unhandled Exception: There is not enough space on the disk. at System.IO.__Error.WinIOError  (Int32 errorCode, String maybeFullPath) at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count) at Ionic.Zip.ZipEntry.ExtractAndCrc(Stream archiveStream, Stream targetOutput, Int16 compressionMethod, Int64 compressedFileDataSize, Int64 uncompressedSize) at Ionic.Zip.ZipEntry.ExtractToStream(Stream archiveStream, Stream output, EncryptionAlgorithm encryptionAlgorithm, Int32 expectedCrc32) at Ionic.Zip.ZipEntry.InternalExtractToBaseDir(String baseDir, String password, ZipContainer zipContainer, ZipEntrySource zipEntrySource, String fileName) at Ionic.Zip.ZipFile._InternalExtractAll(String path, Boolean overrideExtractExistingProperty) at AssemblyBinder.WorkerRole.OnStart() in D:\compressor\AssemblyBinder\WorkerRole.cs:line 56 at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum) at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge. <InitializeRole> b__0() at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()'[2018-08-12T14:47:25Z] Last exit time: [2018/08/12, 14:47:25.965].

Étapes de résolution des problèmes

À partir de la pile des appels d’erreurs, il semble que ce WorkerRole effectue une opération de décompression ou d’extraction sur la méthode OnStart(), mais qu’il échoue en raison d’un stockage insuffisant. La prochaine question évidente qui vous vient à l’esprit est où exactementWaWorkerHost.exe processus est l’extraction du fichier.

Pour trouver la réponse, utilisez l’outil Process Monitor pour prendre une trace ProcMon et voir ce que vous pouvez trouver.

Capture d’écran de la trace ProcMon dans Process Monitor.

WaWorkerHost.exe processus écrit un fichier dans son répertoire temporaire par défaut, qui a une taille maximale de 100 Mo, qui peut devenir plein à un moment donné. Lorsque vous accédez au répertoire RoleTemp , vous pouvez constater que le quota d’espace disque est effectivement épuisé pour ce répertoire.

Capture d’écran du répertoire RoleTemp.

Vous avez peut-être identifié la cause du problème, mais que devez-vous faire en cas de manque d’espace dans l’emplacement RoleTemp ? Voici la réponse.

Par conséquent, vous devez configurer une ressource de stockage locale et pointer les répertoires TEMP et TMP vers le chemin d’accès de la ressource de stockage local comme ci-dessous :

La déclaration de ressource locale doit avoir été ajoutée au fichier de définition de service pour le rôle AssemblyBinder.

<?xml version="1.0" encoding="UTF-8"?>
<LocalResources>
   <LocalStorage name="FileStorage" cleanOnRoleRecycle="true" sizeInMB="200" />
</LocalResources>

Cette modification doit être effectuée dans la méthode RoleEntryPoint.OnStart .

localResource = RoleEnvironment.GetLocalResource("FileStorage");
Environment.SetEnvironmentVariable("TMP", localResource.RootPath);
Environment.SetEnvironmentVariable("TEMP", localResource.RootPath);

Contactez-nous pour obtenir de l’aide

Pour toute demande ou assistance, créez une demande de support ou posez une question au support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.