AssemblyBinder-Rolle instance eine System.IO.IOException-Ausnahme auslöst

Dieser Artikel enthält Informationen zur Behandlung von Problemen, bei denen die AssemblyBinder-Rolle instance der Compressor-Anwendung zwischen dem Status "Ausgelastet" und "Neu gestartet" hängen bleibt und eine System.IO.IOException-Ausnahme auslöst, die besagt: Auf dem Datenträger ist nicht genügend Speicherplatz vorhanden.

Ursprüngliche Produktversion: API Management Service
Ursprüngliche KB-Nummer: 4464907

Hinweis

Lesen Sie den Artikel zur Azure Cloud Service-Problembehandlungsreihe. Dies ist das zweite Szenario des Labs. Stellen Sie sicher, dass Sie die Lab-Einrichtungsanweisungen für die Compressor-Anwendungwie folgt befolgt haben, um das Problem neu zu erstellen.

Problembeschreibung

Die AssemblyBinder-Rolle instance der Compressor-Anwendung löst auf dem Blatt Azure-Portal die folgende Ausnahme aus und bleibt zwischen dem Status "Beschäftigt" und "Neu starten" hängen.

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

Problembehandlungsschritte

Aus der Fehleraufrufliste sieht es so aus, als ob diese WorkerRole einen Entzip- oder Extraktionsvorgang bei der OnStart() -Methode ausführt, aber aufgrund unzureichenden Speichers fehlschlägt. Die nächste offensichtliche Frage, die Ihnen in den Sinn kommt, ist, wo genau WaWorkerHost.exe Prozess die Datei extrahiert.

Um die Antwort herauszufinden, verwenden Sie das Prozessmonitor-Tool , um eine ProcMon-Ablaufverfolgung zu erstellen und zu sehen, was Sie finden können.

Screenshot der ProcMon-Ablaufverfolgung im Prozessmonitor.

WaWorkerHost.exe Prozess eine Datei in sein temporäres Standardverzeichnis schreibt, das eine maximale Größe von 100 MB hat, die irgendwann voll werden kann. Wenn Sie zum Verzeichnis RoleTemp navigieren, stellen Sie möglicherweise fest, dass das Speicherplatzkontingent für dieses Verzeichnis tatsächlich erschöpft ist.

Screenshot des Verzeichnisses

Möglicherweise haben Sie die Ursache des Problems herausgefunden, aber was sollten Sie tun, wenn der Speicherplatz am RoleTemp-Standort knapp wird? Hier ist die Antwort.

Daher sollten Sie eine lokale Speicherressource konfigurieren und die Temp- und TMP-Verzeichnisse wie folgt auf den Pfad der lokalen Speicherressource verweisen:

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 innerhalb der RoleEntryPoint.OnStart-Methode ausgeführt werden.

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

Kontaktieren Sie uns für Hilfe

Wenn Sie Fragen haben oder Hilfe mit Ihren Azure-Gutschriften benötigen, dann erstellen Sie beim Azure-Support eine Support-Anforderung oder fragen Sie den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.