共用方式為


AssemblyBinder 角色實例擲回 System.IO.IOException 例外狀況

本文提供疑難解答在 Busy 和 Restarting 狀態之間卡住的 AssemblyBinder 角色實例以及擲回 System.IO.IOException 例外狀況的問題的相關信息:磁碟上沒有足夠的空間。

原始產品版本:API 管理 服務
原始 KB 編號: 4464907

注意

請參閱 Azure 雲端服務疑難解答系列文章,這是實驗室的第二個案例。 請確定您已依照此方式依照其指示,依照指示來重新建立問題。

徵兆

Compressor 應用程式的 AssemblyBinder 角色實例會在 [Azure 入口網站] 刀鋒視窗中擲回下列未處理的例外狀況,並停滯在 [忙碌] 和 [重新啟動] 狀態之間。

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

疑難排解步驟

從錯誤呼叫堆疊中,此 WorkerRole 在 OnStart() 方法上執行一些解壓縮或擷取作業,但由於記憶體不足而失敗。 下一個顯而易見的問題,會浮出心意來的是,確切 WaWorkerHost.exe 程式正在擷取檔案的位置。

若要找出答案,請使用 行程監視器 工具來取得 ProcMon 追蹤,並查看您可以找到的內容。

進程監視器中 ProcMon 追蹤的螢幕快照。

WaWorkerHost.exe程式會在其預設暫存目錄中寫入一些檔案,其大小上限為 100 MB,這在某個時間點可能會變成完整。 流覽至 RoleTemp 目錄時,您可能會發現該目錄的磁碟空間配額確實已用盡。

RoleTemp 目錄的螢幕快照。

您可能已經找出問題的原因,但在 RoleTemp 位置空間不足時,您應該怎麼做? 以下是 答案。

因此,您應該設定本機記憶體資源,並將 TEMP 和 TMP 目錄指向本機記憶體資源的路徑,如下所示:

本機資源宣告必須已新增至 AssemblyBinder 角色的服務定義檔。

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

此修改應在 RoleEntryPoint.OnStart 方法內執行。

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

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。