Dela via


AssemblyBinder-rollinstansen genererar System.IO.IOException-undantag

Den här artikeln innehåller information om felsökningsproblem där AssemblyBinder-rollinstansen av kompressorprogrammet har fastnat mellan tillståndet Upptagen och Omstart och utlöser System.IO.IOException-undantag som anger: Det finns inte tillräckligt med utrymme på disken.

Ursprunglig produktversion: API Management Service
Ursprungligt KB-nummer: 4464907

Kommentar

I artikeln om felsökningsserien för Azure Cloud Service är det här det andra scenariot i labbet. Kontrollera att du har följt instruktionerna för labbkonfiguration för kompressorprogrammet enligt detta för att återskapa problemet.

Symptom

AssemblyBinder-rollinstansen i Compressor-programmet genererar undantaget nedan på bladet Azure Portal och fastnar mellan tillståndet Upptagen och Omstart.

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].

Felsökningssteg

Från felanropsstacken ser det ut som om den här WorkerRole utför en viss uppacknings- eller extraheringsåtgärd på Metoden OnStart(), men den misslyckas på grund av otillräcklig lagring. Nästa uppenbara fråga som kommer att komma till ditt sinne är var exakt WaWorkerHost.exe processen är att extrahera filen.

För att ta reda på svaret använder du processövervakarverktyget för att ta en ProcMon-spårning och se vad du kan hitta.

Skärmbild av ProcMon-spårning i Process Monitor.

WaWorkerHost.exe processen skriver en fil i sin temporära standardkatalog, som har en maximal storlek på 100 MB, som kan bli full någon gång. När du navigerar till katalogen RoleTemp kanske du upptäcker att diskutrymmeskvoten verkligen blir förbrukad för den katalogen.

Skärmbild av katalogen RoleTemp.

Du kanske har listat ut orsaken till problemet, men vad ska du göra när utrymmet på RoleTemp-platsen tar slut? Här är svaret.

Därför bör du konfigurera en lokal lagringsresurs och peka TEMP- och TMP-katalogerna på sökvägen till den lokala lagringsresursen som nedan:

Den lokala resursdeklarationen måste ha lagts till i tjänstdefinitionsfilen för rollen AssemblyBinder.

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

Den här ändringen bör utföras i metoden RoleEntryPoint.OnStart .

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

Kontakta oss för att få hjälp

Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.