AssemblyBinder-Rolleninstanz wirft System. IO. IOException-Ausnahme

Dieser Artikel enthält Informationen zur Behandlung von Problemen, bei denen die AssemblyBinder -Rolleninstanz der Compressor-Anwendung zwischen dem Status "beschäftigt" und "neu starten" und "Auslösen der Ausnahme" System. IO. IOException "festgehalten wird: Es ist nicht genügend Speicherplatz auf dem Datenträger vorhanden.

Original Version des Produkts:   API-Verwaltungsdienst
Ursprüngliche KB-Nummer:   4464907

Hinweis

Lesen Sie den Artikel zur Problem Behandlungsserie für Azure Cloud Service, dies ist das zweite Szenario der Übungseinheit. Stellen Sie sicher, dass Sie die Anweisungen für das Lab-Setupfür Compressor Application befolgt haben, um das Problem erneut zu erstellen.

Problembeschreibung

AssemblyBinder -Rolleninstanz der Compressor-Anwendung wirft die unten nicht behandelte Ausnahme im Azure-Portal Blatt und steckt zwischen dem Status "beschäftigt" und "Neustart".

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

Problembehandlung bei Schritten

Aus der Fehler Aufrufliste sieht es so aus, dass WorkerRole einige unzip-oder Extract-Vorgänge bei der OnStart () -Methode ausführt, aber aufgrund unzureichender Speicherkapazität fehlschlägt. Die nächste offensichtliche Frage, die Ihnen in den Kopf kommt, ist, wo genau WaWorkerHost.exe Prozess die Datei extrahiert.

Um die Antwort herauszufinden, verwenden Sie Process Monitor Tool, um eine procmon-Ablaufverfolgung zu erstellen und zu sehen, was Sie finden können.

Screenshot der procmon-Ablaufverfolgung.

WaWorkerHost.exe Prozess schreibt eine Datei in das standardmäßige temporäre Verzeichnis, das eine maximale Größe von 100 MB aufweist, die an einem bestimmten Zeitpunkt vollständig sein kann. Wenn Sie zum RoleTemp -Verzeichnis navigieren, wird möglicherweise feststellen, dass das Speicherplatzkontingent tatsächlich für dieses Verzeichnis erschöpft ist.

Screenshot des RoleTemp-Verzeichnisses.

Möglicherweise haben Sie die Ursache des Problems herausgefunden, aber was sollten Sie tun, wenn der Speicherplatz am RoleTemp-Standort nicht mehr verfügbar ist   ? Hier ist die Antwort.

Daher sollten Sie eine lokale Speicherressource konfigurieren und die Ordner Temp und tmp auf den Pfad der lokalen Speicherressource wie unten richten:

Die lokale Ressourcendeklaration muss der dienstdefinitionsdatei für die AssemblyBinder-Rolle hinzugefügt worden sein.

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

Diese Änderung sollte in der RoleEntryPoint. OnStart   -Methode ausgeführt werden.

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